1.被final修饰而没有被static修饰的类的属性变量只能在三种情况下初始化:
1.1 在它被定义时
public class Test{
public final int a = 0;
private Test(){
}
}
1.2 在构造函数里初始化
public class Test{
public final int a ;
private Test(){
a = 0;
}
}
1.3 在程序块中初始化
public class Test{
public final int a ;
{
a = 0;
}
}
当这个属性被修饰为final 而非static的时候 它属于类的对象的资源 当类被加载进内存的时候 这个属性并没有给其分配内存空间 而只是定义了一个变量a 只有当创建当前类的对象的时候 这个属性才被分配内存空间 而创建对象的时候同时执行了构造方法 所以属性被初始化了 而构造方法执行前会默认先执行程序块 这就符合了当它被分配内存空间的时候就需要初始化 以后不再改变的条件
2.同时被被final和static修饰的类的属性变量只能在两种情况下初始化:
2.1 在它被定义时
public class Test{
public static final int a = 0;
}
2.2 在类的静态块里初始化
public class Test{
public static final int a;
static{
a = 0;
}
}
当类的属性被同时被修饰为static和final的时候 他属于类的资源 那么就是类在被加载进内存的时候(也就是应用程序启动的时候)就要为属性分配内存 所以此时属性已经存在 它又被final修饰 所以必须在属性定义了以后就给其初始化值 而构造方法是在当创建当前类的对象候才会执行 所以不能用构造方法 而static块是类被加载的时候执行 且只执行这一次 所以在static块中可以执行初始化