background image

public

 

static

 Random rand = 

new

 Randdom(47);

public

 

static

 void main(String[] args){

Class initable = Initable.

class

//不会引起初始化

 
System.out.println("after creating Initable reference");
System.out.println(Initable.staticFinal); 

//引用编译器常量不会引起初始化

 
System.out.println(Initable.staticFinal2); 

//引起初始化

 
System.out.println(Initable2.staticNoFinal); 

//引用非编译期常量会引起初始化

 
Class initable3 = Class.forName("Initable3"); 

//默认会引起初始化

 
System.out.println("after creating Initable3 reference");
System.out.println(Initable3.staticNoFinal);

//前面已经初始化此处不用再初始化

 
}
}
 
输出结果:
after creating Initable reference
47
Initialization Initable
258
Initialization Initable2
147
Initialization Initable3
after creating Initable3 reference
74
如果一个

static

 

final

值是编译期常量,那么对该值的引用无需对其所在类进行初始化;若

仅仅是

static

final

但不是编译期常量,则会引发初始化其类。若是引用一个

static

值则要

进行链接并对其所在类进行初始化。