3.7 修饰符总结
如前所示,类、接口和它们的成员都能使用一个或多个修饰符声明——这些修饰符是 public、static 和 final 等关键字。下面对本章做个总结,列出所有 Java 修饰符,说明各自能修饰的 Java 结构种类和作用。详情如表 3-2 所示。还可以参阅 3.1 节、3.2.1 节和 2.6.2 节。
表3-2:Java修饰符
| 修饰符 | 用于 | 意义 |
|---|---|---|
abstract | 类 | 这个类不能实例化,而且可能包含未实现的方法 |
| 接口 | 所有接口都是抽象的。声明接口时这个修饰符是可选的 | |
| 方法 | 这个方法没有主体,主体由子类提供。签名后面是一个分号。所在的类必须也是抽象的 | |
default | 方法 | 这个接口方法的实现是可选的。接口为不想实现这个方法的类提供了一个默认实现。详情参见第 4 章 |
final | 类 | 不能创建这个类的子类 |
| 方法 | 不能覆盖这个方法 | |
| 字段 | 这个字段的值不能改变。static final 修饰的字段是编译时常量 | |
| 变量 | 值不能改变的局部变量、方法参数或异常参数 | |
native | 方法 | 这个方法使用某种与平台无关的方式实现(经常使用 C 语言)。没有提供主体,签名后面是一个分号 |
| 无(包) | 类 | 没声明为 public 的类只能在包中访问 |
| 接口 | 没声明为 public 的接口只能在包中访问 | |
| 成员 | 没声明为 private、protected 或 public 的成员具有包可见性,只能在包中访问 | |
private | 成员 | 这个成员只在定义它的类中可以访问 |
protected | 成员 | 这个成员只在定义它的包中和子类中可以访问 |
public | 类 | 能访问所在包的地方都能访问这个类 |
| 接口 | 能访问所在包的地方都能访问这个接口 | |
| 成员 | 能访问所在类的地方都能访问这个成员 | |
strictfp | 类 | 这个类中的所有方法都隐式声明为 strictfp |
| 方法 | 这个方法必须使用严格遵守 IEEE 754 标准的方式执行浮点运算。具体而言,所有数值,包括中间结果,都要使用 IEEEfloat 或 double 类型表示,而且不能利用本地平台浮点格式或硬件提供的额外精度或取值范围。这个修饰符极少使用 | |
static | 类 | 使用 static 声明的内部类是顶层类,而不是所在类的成员。详情参见第 4 章 |
| 方法 | static 方法是类方法。不隐式传入 this 对象引用。可通过类名调用 | |
| 字段 | static 字段是类字段。不管创建多少类实例,这个字段都只有一个实例。可通过类名访问 | |
| 初始化程序 | 这个初始化程序在加载类时运行,而不是创建实例时运行 | |
synchronized | 方法 | 这个方法对类或实例执行非原子操作,所以必须小心,确保不能让两个线程同时修改类或实例。对 static 方法来说,执行方法之前先为类获取一个锁。对非 static 方法来说,会为具体的对象实例获取一个锁。详情参见第 5 章 |
transient | 字段 | 这个字段不是对象持久化状态的一部分,因此不会随对象一起序列化。在对象序列化时使用,参见 java.io.ObjectOutputStream |
volatile | 字段 | 这个字段能被异步线程访问,因此必须对其做些特定的优化。这个修饰符有时可以替代 synchronized。详情参见第 5 章 |
