1、類的主動引用,一定會發生類的初始化。當虛擬機啟動,先初始化main方法所在的類
實例化一個類的對象
調用類的靜態成員(除了final常量)和靜態方法
使用java.lang.reflect包的方法對類進行反射調用
當初始化一個類,如果其父類沒有被初始化,則先會初始化它的父類
2、類的被動引用,不會發生類的初始化
當訪問一個靜態域時,只有真正聲明這個域的類才會被初始化。如:當通過子類引用父類的靜態變量,不會導致子類初始化
通過數組定義類引用,不會觸發此類的初始化
引用常量不會觸發此類的初始化(常量在鏈接階段就存入調用類的常量池中了)
實例
package com.volcano.reflection;
//什么時候會發生類的初始化,除了第一個注釋一直開著,其他都要獨立打開測試,否則不準確
public class TestReflection3 {
static {
//1.虛擬機啟動就會最先初始化main方法所在的類 會
System.out.println("main方法被加載");
}
public static void main(String[] args) throws ClassNotFoundException {
//2.實例化一個對象 會
//new Father();
//3.調用類的靜態成員(除了final常量)和靜態方法 會
//System.out.println(Son.a);
//4.使用java.lang.reflect包的方法對類進行反射調用 會
//Class cls = Class.forName("com.volcano.reflection.Father");
//5.當初始化一個類,如果其父類沒有被初始化,則先會初始化它的父類 會
//new Son();
//6.當訪問一個靜態域時,只有真正聲明這個域的類才會被初始化 不會
//System.out.println(Father.a);//兩個都是只加載Father
//System.out.println(Son.a);//因為a是Father的靜態成員
//7.通過數組定義類引用,不會觸發此類的初始化 不會
//Father[] fathers = new Father[10];
//8.引用常量不會觸發此類的初始化 不會
//System.out.println(Father.B);
}
}
class Father{
static {
System.out.println("Father被加載");
}
static int a=100;
static final int B = 300;
}
class Son extends Father{
static {
System.out.println("Son被加載");
}
static int c=200;
}
以上就是java類的兩種引用方法,希望對大家有所幫助。更多關于“java培訓”的問題,歡迎咨詢千鋒教育在線名師。千鋒教育多年辦學,課程大綱緊跟企業需求,更科學更嚴謹,每年培養泛IT人才近2萬人。不論你是零基礎還是想提升,都可以找到適合的班型,千鋒教育隨時歡迎你來試聽。