加載機制系列
類加載機制(一)
類加載機制(二)
類加載機制(三)
類的加載全過程中的主動引用與被動引用
類的主動引用(會初始化)
- new 一個類的對象
- 調(diào)用類的靜態(tài)成員(除了final修飾的常量)和靜態(tài)方法
- 使用java.lang.reflect包的反射調(diào)用
- 虛擬機啟動main方法所在的類
- 當(dāng)調(diào)用一個類時候,如果其父類沒有被初始化則先初始化其父類
類的被動引用(不會初始化)
- 當(dāng)訪問一個靜態(tài)域時,只有真正生命這個域的類才會被初始化,如:通過子類引用父類的靜態(tài)變量時候,不會導(dǎo)致子類初始化
- 通過數(shù)組定義類引用 不會被初始化
- 引用常量不會觸發(fā)此類的初始化 (常量在編譯階段已存入調(diào)用該類的常量池中了)
Demo
public class Demo01 {
static {
System.out.println("靜態(tài)初始化類Demo01");
}
public static void main(String[] args) {
System.out.println("Demo01的main() 方法");
A a = new A();
System.out.println(A.width);
}
}
class A_Father {
public static int father_width=10;
public final static int father_final_test=333;
static {
System.out.println("靜態(tài)初始化類A_father");
}
}
class A extends A_Father {
public static int width = 100;
static {
System.out.println("靜態(tài)初始化類A");
width = 300;
}
public A() {
System.out.println("創(chuàng)建A對象");
}
}
結(jié)果:
先初始化A的父類 A_Father
靜態(tài)初始化類Demo01
Demo01的main() 方法
靜態(tài)初始化類A_father
靜態(tài)初始化類A
創(chuàng)建A對象
300
修改main方法
public static void main(String[] args) {
// System.out.println("Demo01的main() 方法");
// A a = new A();
//調(diào)用A的靜態(tài)域
System.out.println(A.width);
}
結(jié)果:A類被加載初始化
靜態(tài)初始化類Demo01
靜態(tài)初始化類A_father
靜態(tài)初始化類A
300
再次修改直接用反射調(diào)用
public static void main(String[] args) throws Exception{
// System.out.println("Demo01的main() 方法");
// A a = new A();
//調(diào)用A的靜態(tài)域
//System.out.println(A.width);
//反射調(diào)用
Class.forName("com.org.test.init.A");
}
結(jié)果:A類被加載初始化
靜態(tài)初始化類Demo01
靜態(tài)初始化類A_father
靜態(tài)初始化類A
調(diào)用常量:
public static void main(String[] args) throws Exception{
// System.out.println("Demo01的main() 方法");
// A a = new A();
//調(diào)用A的靜態(tài)域
//System.out.println(A.width);
//反射調(diào)用
//Class.forName("com.org.test.init.A");
//調(diào)用常量
System.out.println(A_Father.father_final_test);
}
結(jié)果:類沒有加載初始化
靜態(tài)初始化類Demo01
333
調(diào)用父類靜態(tài)域
public static void main(String[] args) throws Exception{
// System.out.println("Demo01的main() 方法");
// A a = new A();
//調(diào)用A的靜態(tài)域
//System.out.println(A.width);
//反射調(diào)用
//Class.forName("com.org.test.init.A");
//調(diào)用常量
//System.out.println(A_Father.father_final_test);
//調(diào)用父類靜態(tài)變量
System.out.println(A_Father.father_width);
}
結(jié)果:只有父類被加載初始化
靜態(tài)初始化類Demo01
靜態(tài)初始化類A_father
10
數(shù)組引用:
public static void main(String[] args) throws Exception{
// System.out.println("Demo01的main() 方法");
// A a = new A();
//調(diào)用A的靜態(tài)域
//System.out.println(A.width);
//反射調(diào)用
//Class.forName("com.org.test.init.A");
//調(diào)用常量
//System.out.println(A_Father.father_final_test);
//調(diào)用父類靜態(tài)變量
//System.out.println(A_Father.father_width);
//數(shù)組變量引用
A[] as= new A[10];
}
結(jié)果:類不會被加載
靜態(tài)初始化類Demo01