類的加載過程

  • 查看單例模式時,發(fā)現(xiàn)類的加載過程有點忘了(全部都被我當(dāng)飯吃了,(*_*))。因此在這里記錄下。
package com.d4c.order;

public class A {
    public static final int staticFiledA = 1;
    public final int filedA = 2;

    A() {
        System.out.println("------------------------------");
        System.out.println("A constructor");
        System.out.println("staticFiledA:" + staticFiledA);
        System.out.println("filedA:" + filedA);
        System.out.println("------------------------------");
    }

    static {
        System.out.println("------------------------------");
        System.out.println("A static code block");
        System.out.println("staticFiledA:" + staticFiledA);
        System.out.println("------------------------------");
    }

    {
        System.out.println("------------------------------");
        System.out.println("A code block");
        System.out.println("staticFiledA:" + staticFiledA);
        System.out.println("filedA:" + filedA);
        System.out.println("------------------------------");
    }

    public static final void staticMethodA() {
        System.out.println("------------------------------");
        System.out.println("A static method");
        System.out.println("staticFiledA:" + staticFiledA);
        System.out.println("------------------------------");
    }


}
//-------------------------------------------

package com.d4c.order;

public class B extends A{

    public static final int staticFiled = 3;
    public final int filed = 4;

    B() {
        System.out.println("------------------------------");
        System.out.println("B constructor");
        System.out.println("staticFiled:" + staticFiled);
        System.out.println("filed:" + filed);
        System.out.println("------------------------------");
    }

    static {
        System.out.println("------------------------------");
        System.out.println("B static code block");
        System.out.println("staticFiled:" + staticFiled);
        System.out.println("------------------------------");
    }

    {
        System.out.println("------------------------------");
        System.out.println("B code block");
        System.out.println("staticFiled:" + staticFiled);
        System.out.println("filed:" + filed);
        System.out.println("------------------------------");
    }

    public static final void staticMethod() {
        System.out.println("------------------------------");
        System.out.println("B static method");
        System.out.println("staticFiled:" + staticFiled);
        System.out.println("------------------------------");
    }


    public static void main(String[] args) {
        B b = new B();
    }

}

輸出結(jié)果:

------------------------------
A static code block
staticFiledA:1
------------------------------
------------------------------
B static code block
staticFiled:3
------------------------------
------------------------------
A code block
staticFiledA:1
filedA:2
------------------------------
------------------------------
A constructor
staticFiledA:1
filedA:2
------------------------------
------------------------------
B code block
staticFiled:3
filed:4
------------------------------
------------------------------
B constructor
staticFiled:3
filed:4
------------------------------

結(jié)論:
靜態(tài)變量:

  • 可以將靜態(tài)變量理解為類變量(與對象無關(guān)),而實例變量則屬于一個特定的對象。
  • 靜態(tài)變量有兩種情況:
    • 靜態(tài)變量是基本數(shù)據(jù)類型,這種情況下在類的外部不必創(chuàng)建該類的實例就可以直接使用
    • 靜態(tài)變量是一個引用。這種情況比較特殊,主要問題是由于靜態(tài)變量是一個對象的引用,那么必須初始化這個對象之后才能將引用指向它。因此如果要把一個引用定義成static的,就必須在定義的時候就對其對象進(jìn)行初始化。

靜態(tài)方法:

  • 在內(nèi)存中只有一份。
  • 靜態(tài)方法可以直接使用,而實例方法必須在類實例化之后通過對象來調(diào)用。
  • 在外部調(diào)用靜態(tài)方法時,可以使用“類名.方法名”或者“對象名.方法名”的形式。
  • 實例方法只能使用這種方式對象名.方法名。
  • 靜態(tài)方法只允許訪問靜態(tài)成員。而實例方法中可以訪問靜態(tài)成員和實例成員。
  • 靜態(tài)方法中不能使用this(因為this是與實例相關(guān)的)。

靜態(tài)代碼塊:

  • 靜態(tài)代碼塊會在類被加載時自動執(zhí)行。
  • 靜態(tài)代碼塊只能定義在類里面,不能定義在方法里面。
  • 靜態(tài)代碼塊里的變量都是局部變量,只在塊內(nèi)有效。
  • 一個類中可以定義多個靜態(tài)代碼塊,按順序執(zhí)行。
  • 靜態(tài)代碼塊只能訪問類的靜態(tài)成員,而不允許訪問實例成員。

順序

父類的靜態(tài)字段——>父類靜態(tài)代碼塊——>子類靜態(tài)字段——>子類靜態(tài)代碼塊——>父類成員變量(非靜態(tài)字段)——>父類非靜態(tài)代碼塊——>父類構(gòu)造器——>子類成員變量——>子類非靜態(tài)代碼塊——>子類構(gòu)造器

引用參考

java中類加載與靜態(tài)變量、靜態(tài)方法與靜態(tài)代碼塊詳解與初始化順序

最后編輯于
?著作權(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)容