類加載機制(二)

加載機制系列
類加載機制(一)
類加載機制(二)
類加載機制(三)
類的加載全過程中的主動引用與被動引用

類的主動引用(會初始化)
  • 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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容