一、static
1、static修饰的字段,所有对象共用一个空间(在perm中)。
非static修饰的字段,所有对象都有自己的空间(在heap中)。
2、static修饰的字段有两种调用方法。
a、通过new一个对象去调用
b、通过类名.字段去调用
二、final
1、对于final修饰的成员变量来讲,必须在声明时或构造方法中对其赋值------>在使用前总是被初始化的原因。
2、不能因为是final修饰的变量就认为在编译时可以知道他的值。
例:final int i = rand.nextInt(20);
3、类中所有private方法都隐式地指定为final的。
三、final与static
1、定义为final说明它是一个常量,定义为static则强调只有一份。
2、static修饰的变量赋值发生在类加载阶段(static赋值发生在初始化阶段、static fianl 修饰发生在准备阶段,这两个阶段都属于类加载阶段),类加载只发生一次,class对象也只有一个。
3、常量在编译阶段会存入调用类的常量池中(注:javap -verbose xx.class 查看字节码)
例:
class 被调用类 {
static int a = 123;
static final int b = 123;
}
class 调用类 {
被调用类 被调用类 = new 被调用类(); //调用类的常量池中有被调用类的符号引用
被调用类.a; //a不是常量,所以调用类的常量池中有被调用类的符号引用,没有“123”。被调用类会被初始化
被调用类.b; //b是常量,所以调用类的常量池中没有被调用类的符号引用,有“123”。被调用类不会被初始化
}