访问控制修饰符

修饰符 同包 不同包
类中 类外 子类 非子类
public Y Y Y Y
protected Y Y Y N
(default) Y Y N N
private Y N N N

这里的(default)是没有任何访问修饰符的默认情况,与default关键字无关。

非访问控制修饰符

(一)static

static可以修饰变量、代码块、方法和内部类,表明这是一个静态的代码。静态代码是属于类的,非final的静态代码存储在方法区,故静态代码不具备继承、多态等特性。静态方法和成员不可以被非静态方法调用。JDK1.8起,接口中也可存在静态方法。

(二)final

final可以修饰变量、方法和类,表明这是一个常量或不能被重写或继承的方法或类。final变量作为常量只能够在定义时或静态代码块中被赋值一次。final方法可以被继承,不能被重写。final类不能被继承,故没有子类。final代码存储在运行时常量区。

(三)abstract

abstract可以修饰方法和类,表明这是一个抽象方法或抽象类。抽象方法是不写明方法体(方法实现)的方法,其作用为用于被子类继承,为必定被继承的方法提供简便的写法。具有抽象方法的类即抽象类(但抽象类不一定有抽象方法)。继承抽象类的子类需要重写父类的全部抽象方法,否则也要将自己声明为抽象类。抽象类可以拥有构造器,但不能被实例化为对象,只能被子类调用。

(四)synchronized 、volatile

这两个修饰符主要用于线程的编程。
synchronized关键字用于为方法或代码块添加锁,以保证线程安全。被synchronized修饰的代码被称为同步代码。

(五)transient

当使用对象流序列化某个对象时,如果该对象的属性被transient所修饰,则该变量不会被序列化。对该对象反序列化后,该属性为默认值。

(六)native

native修饰符,表明这是一个使用本地方法栈的方法,该方法由非Java语言编写。

(七)strict

strict即strict float point,精确浮点(strictfp)。当对一个类或接口使用strictfp关键字时,该类中的所有代码,包括嵌套类型中的初始设定值和代码,都将严格地进行计算。这意味着所有表达式的结果都必须是IEEE 754算法对操作数预期的结果,以单精度和双精度格式表示。此关键字可应用于类、接口或方法。

修饰符工具类

修饰符具有一个工具类java.lang.reflect.Modifier,能够对修饰符进行解码和编码。能够通过类镜像获取类、属性、方法和构造器的修饰符编码。编码为12位的二进制码,其编码规则为:

strict - abstract - interface - native - transient - volatile - synchronized - final - static - protected - private - public

以上修饰符为编码从最高位到最低位的顺序,每一位所表示的修饰符,1代表具有,0代表不具有。如0x011表示final public。对编码的解码可以使用Modifier.toString()方法。