Java 修饰符
修饰符用来给类、方法、变量附加属性:一类控制「谁能访问」,叫访问修饰符;另一类改变「行为特性」,叫非访问修饰符。
访问修饰符可见范围
Java 有 public、protected、默认(不写)与 private 四种访问级别:
| 修饰符 | 同类 | 同包 | 子类(不同包) | 任意类 |
|---|---|---|---|---|
| public | 可以 | 可以 | 可以 | 可以 |
| protected | 可以 | 可以 | 可以 | 不可以 |
| 默认(不写) | 可以 | 可以 | 不可以 | 不可以 |
| private | 可以 | 不可以 | 不可以 | 不可以 |
经验法则:类尽量用 public,成员变量尽量 private,方法按需放行,尽量缩小暴露面。
非访问修饰符一览
| 修饰符 | 作用 |
|---|---|
| static | 静态,属于类而不是某个对象 |
| final | 最终,不可继承、不可重写、不可再赋值 |
| abstract | 抽象,类不可实例化、方法留给子类实现 |
| synchronized | 同步,多线程下保证方法互斥访问 |
| volatile | 易变,多线程间保证变量可见性 |
| transient | 瞬态,序列化时忽略该字段 |
static 变量与方法
static 成员属于类本身:直接用类名调用,无需创建对象,并且所有对象共享同一份:
class Counter {
static int total = 0; // 静态变量,所有对象共享
Counter() {
total++; // 每 new 一次加 1
}
static void show() { // 静态方法
System.out.println("总对象数:" + total);
}
}
public class TestStatic {
public static void main(String[] args) {
new Counter();
new Counter();
Counter.show(); // 类名直接调用静态方法
}
}
// 输出:总对象数:2
注意:静态方法里不能直接访问非静态成员,因为它不依赖某个具体对象。
final 的三种用途
- final 类:不能被继承,如 String;
- final 方法:不能被子类重写;
- final 变量:赋值后不可再改。
public class FinalDemo {
static final int MAX = 100; // final 变量,常配合 static 做常量
public static void main(String[] args) {
// MAX = 200; // 编译错误:final 变量不能重新赋值
System.out.println(MAX); // 输出:100
}
}
修饰符组合常见写法
修饰符常组合使用,顺序无强制要求,习惯写法如下(片段需放进类的定义中):
public static final double PI = 3.14159; // 公开常量
private static int count = 0; // 私有静态变量
public synchronized void save() { } // 同步方法
public abstract class Shape { } // 抽象类
访问修饰符管「谁能用」,非访问修饰符管「怎么用」:private 封装细节、public 暴露接口、static 归属类、final 不可变,组合使用即可写出规范的 Java 代码。