一、访问控制修饰符
修饰符 |
适用对象 |
作用范围 |
说明 |
public |
类、方法、变量 |
全局可见 |
所有包中的类均可访问 |
protected |
方法、变量 |
同包或子类可见 |
不同包的子类通过继承访问 |
默认 |
类、方法、变量 |
同包可见(无修饰符) |
不写任何修饰符时的默认行为 |
private |
方法、变量 |
仅当前类可见 |
用于封装数据,隐藏实现细节 |
二、非访问修饰符
修饰符 |
适用对象 |
作用说明 |
关键特性 |
static |
变量、方法、代码块、内部类 |
类级别共享 |
通过类名直接访问,不依赖实例 |
final |
类、方法、变量 |
不可变/不可继承 |
常量、不可重写的方法、不可继承的类(如 String ) |
abstract |
类、方法 |
定义抽象结构 |
抽象类不能实例化,抽象方法需子类实现 |
synchronized |
方法、代码块 |
线程同步 |
防止多线程并发访问导致数据不一致 |
volatile |
变量 |
保证多线程可见性 |
避免指令重排序,直接读写主内存 |
transient |
变量 |
序列化时忽略该变量 |
敏感数据(如密码)不持久化 |
native |
方法 |
本地方法(由 JVM 外代码实现) |
通常用于调用 C/C++ 库 |
strictfp |
类、方法 |
确保浮点运算平台一致性 |
严格遵循 IEEE 754 标准 |
三、Java 17+ 新增修饰符
修饰符 |
适用对象 |
作用说明 |
关键特性 |
sealed |
类、接口 |
限制类的继承/实现 |
通过 permits 指定允许的子类 |
non-sealed |
类、接口 |
解除 sealed 类的限制 |
允许任意继承 |
permits |
类、接口 |
指定允许继承的子类(与 sealed 配合使用) |
需在父类中声明 |
四、特殊场景修饰符
修饰符 |
适用对象 |
作用说明 |
示例或说明 |
default |
接口方法 |
接口的默认方法实现(Java 8+) |
解决接口扩展问题,子类可选择重写 |
var |
局部变量 |
类型推断(Java 10+) |
var list = new ArrayList<String>(); |
五、修饰符冲突与注意事项
冲突组合 |
说明 |
abstract + final |
abstract 方法需子类实现,final 禁止重写,二者矛盾。 |
abstract + private |
private 方法不可见,无法被重写,无法实现抽象方法。 |
static + abstract |
静态方法属于类,无法被子类重写,与 abstract 冲突。 |
final + volatile |
final 变量不可变,volatile 无意义(允许但冗余)。 |
synchronized + abstract |
抽象方法无实现,无法加锁,二者冲突。 |
六、常见修饰符组合
组合 |
典型场景 |
示例 |
public static final |
定义全局常量 |
public static final int MAX_SIZE = 100; |
private static |
类内共享的静态变量 |
private static int instanceCount; |
protected abstract |
供子类实现的抽象方法 |
protected abstract void init(); |
public synchronized |
线程安全的公共方法 |
public synchronized void add() { ... } |
七、修饰符作用域总览
修饰符 |
类 |
接口 |
方法 |
变量 |
代码块 |
内部类 |
局部变量 |
public |
✅ |
✅ |
✅ |
✅ |
❌ |
✅ |
❌ |
protected |
❌ |
❌ |
✅ |
✅ |
❌ |
❌ |
❌ |
private |
❌ |
❌ |
✅ |
✅ |
❌ |
✅ |
❌ |
static |
❌ |
❌ |
✅ |
✅ |
✅ |
✅ |
❌ |
final |
✅ |
❌ |
✅ |
✅ |
❌ |
✅ |
✅ |
abstract |
✅ |
✅ |
✅ |
❌ |
❌ |
✅ |
❌ |
volatile |
❌ |
❌ |
❌ |
✅ |
❌ |
❌ |
❌ |
transient |
❌ |
❌ |
❌ |
✅ |
❌ |
❌ |
❌ |
八、关键总结
- 访问控制:
public > protected > 默认 > private
,按需选择最小可见范围。
- 静态与非静态:
static
成员属于类,非静态成员属于实例。
- 不可变性:
final
修饰变量为常量,修饰类禁止继承。
- 线程安全:
synchronized
和 volatile
是多线程编程的关键。
- 抽象与实现:
abstract
定义规范,子类负责具体实现。
通过合理使用修饰符,可以显著提升代码的安全性、可维护性和性能!