当一个类被加载,class.forname或者使用静态方法时,总是先初始化父类的static部分,再初始化子类的static部分,非静态成员一律不初始化。任何一个类的静态部分只被初始化一次
public class Test{
public static void main(String[] args) {
System.out.println("MAIN");
Test0.Fun1();
}
}
class Test0 extends Test1{
static{
System.out.println("Static area in TEST0");
};
Test3 t3;
public static void Fun1(){
}
}
class Test1{
static{
System.out.println("Static area in father class");
};
Test1(){
System.out.println("constructor in father class");
}
}
上述代码输出
MAIN
Static area in father class
Static area in TEST0
当一个类被实例化时,如果类还没有被加载,则先加载,再实例化。实例化中先运行父类的构造函数,再运行子类的构造函数。如果类中的成员没有被初始化,其值为null,其相当于还没有被加载。
public class Test{
public static void main(String[] args) {
System.out.println("MAIN");
Test0 t0 = new Test0();
System.out.println(t0.t3);
}
}
class Test0 extends Test1{
static{
System.out.println("Static area in TEST0");
};
Test3 t3;
public static void Fun1(){
}
Test0(){
System.out.println("constructor in TEST0");
}
}
class Test1{
static{
System.out.println("Static area in father class");
};
Test1(){
System.out.println("constructor in father class");
}
}
class Test3{
static{
System.out.println("Static area in member class");
};
Test3(){
System.out.println("constructor in menber class");
}
}
上面程序输出为
MAIN
Static area in father class
Static area in TEST0
constructor in father class
constructor in TEST0
null
java最开始处理main函数时,相当于如上静态加载main类。Java会线执行Main类父类的静态块,然后是Main类的静态块。