Java中 static/transient,final/volatile 说明
你可以任意使用如下的修改限定关键字来定义一个字段:final或者volatile和/或者static和/或者transient。 如果你将一个字段定义为final,编译器将确保字段当成一个常量——只读变量来初始化和处理。因为编译器知道常量是不变的,所以在程序的字节码中对其进行了内部优化。 class Employee { final int ACCOUNTANT = 1; final int PAYROLL_CLERK = 2; final int MANAGER = 3; int jobID = ACCOUNTANT; } 如果你将一个字段声明为volatile,则多线程将能访问此字段,而特定的编译器将防止最优化以使该字段能被适当的访问。 如果你将一个字段定义为static,则所有对象都将共享此字段的一份拷贝。当你将一个新值赋给这个字段时,所有对象都将得到这个新值。如果没有指定为static,则这个字段将是一个实例字段,每个对象都使用他们自己的一份拷贝。 定义为transient的字段值在对象串行化过程中将不被保存。 实例字段 “实例字段”就是没有使用static修改标识符定义的字段。实例字段和对象紧密相连——而不是和类。当在一个对象代码里修改时,仅仅这个相关的类实例——对象——可以得到这个改变。实例字段随对象的创建而创建,随对象的释放而释放。 类字段 类字段是用static关键字定义的字段。类字段和类联系——而不是对象。当在一个类代码中修改时,这个类(以及所有创建的对象)都能感知这个变化。类字段随类的加载而创建,随类的卸载而释放 常量 “常量”是一种只读变量;当JVM初始化这种变量后,变量的值就不能改变了。 使用final关键字来定义常量。正如有两种字段——实例和类字段,常量也有两种——实例常量和类常量。为了提高效率,应当创建类常量,或者说是final static字段。 class Constants { final int FIRST = 1; final static int SECOND = 2; public static void main(String[] args) { int iteration = SECOND; if (iteration == FIRST)//编译错误 System.out.println(“first iteration”); else if (iteration == SECOND) System.out.println(“second iteration”); } } 上例中的Constants类定义了一对常量——FIRST和SECOND。FIRST是实例常量,因为JVM给每个Constants对象分配一份FIRST的拷贝。相反的,因为JVM在加载Constants类后只创建了一份SECOND拷贝,所以SECOND是类常量。 注意:当你尝试在main()中直接访问FIRST时会导致一个编译错误。常量FIRST直到一个对象创建时才存在,所以FIRST仅仅只能被这个对象所访问——而不是类。