Java虚拟机在首次主动使用类型时初始化它们。下面几种情况下会主动使用:
1.创建类的新实例
2.调用类中声明的静态方法
3.操作类或接口中声明的非常量静态字段
4.调用Java API中特定反射方法
5.初始化一个类的子类
6.指定一个类作为Java虚拟机启动时的初始化类
而被动使用(对于子类、子接口和实现了接口的类引用父亲的非常量静态字段)不会触发初始化。
来看下面的一段代码
=====父类
========JVM启动类
Example2 was initialized!
New parent was initialized...
0
===================================
如果一个既是static又是final的,使用时就不是对这个类的主动使用。示例代码如下:
Example3 was initialized!
Grrr1
wolf,wolf,world!
//可见Dog并没有被初始化
1.创建类的新实例
2.调用类中声明的静态方法
3.操作类或接口中声明的非常量静态字段
4.调用Java API中特定反射方法
5.初始化一个类的子类
6.指定一个类作为Java虚拟机启动时的初始化类
而被动使用(对于子类、子接口和实现了接口的类引用父亲的非常量静态字段)不会触发初始化。
来看下面的一段代码
=====父类
public class NewParent {
static int hoursOfSleep=(int)(Math.random()*3.0);
static{
System.out.println("New parent was initialized...");
}
public NewParent() {
System.out.println("NewParent.NewParent()");
// TODO Auto-generated constructor stub
}
}
========子类public class NewBornBody extends NewParent{
static int houseOfCrying=6+(int)(Math.random()*2.0);
static{
System.out.println("NewBronBody was initiazed.");
}
}
========JVM启动类
public class Example2 {
public static void main(String[] args){
int hours=NewBornBody.hoursOfSleep;
System.out.println(hours);
}
static{
System.out.println("Example2 was initialized!");
}
}
这段代码的执行结果为:Example2 was initialized!
New parent was initialized...
0
===================================
如果一个既是static又是final的,使用时就不是对这个类的主动使用。示例代码如下:
public interface Angry {
String greeting="Grrr1";
}
public class Dog {
static final String greeting="wolf,wolf,world!";
static{
System.out.println("Dog was initialized");
}
static int getAngerLevel(){
System.out.println("Angel was initialized!");
return 1;
}
}
public class Example3 {
public static void main(String[] args){
System.out.println(Angry.greeting);
System.out.println(Dog.greeting);
}
static{
System.out.println("Example3 was initialized!");
}
}
========代码的执行结果为: Example3 was initialized!
Grrr1
wolf,wolf,world!
//可见Dog并没有被初始化