Java基礎 - 父類和子類的初始化順序


順序

1. 父類中靜態成員變量和靜態代碼塊

2. 子類中靜態成員變量和靜態代碼塊

3. 父類中普通成員變量和代碼塊,父類的構造函數

4. 子類中普通成員變量和代碼塊,子類的構造函數

 

其中“和”字兩端的按照代碼先后順序執行:父類靜態塊→子類靜態塊→父類初始化塊(成員變量,非靜態代碼塊等)→父類構造方法→子類初始化塊(成員變量,非靜態代碼塊等)→子類構造方法

 

規律

先父后子、先靜態后普通(普通成員變量、普通代碼塊、構造函數按照代碼先后順序執行)

 

class Parent {
        /* 靜態變量 */
    public static String p_StaticField = "父類--靜態變量";
         /* 變量 */
    public String    p_Field = "父類--變量";
    protected int    i    = 9;
    protected int    j    = 0;
        /* 靜態初始化塊 */
    static {
        System.out.println( p_StaticField );
        System.out.println( "父類--靜態初始化塊" );
    }
        /* 初始化塊 */
    {
        System.out.println( p_Field );
        System.out.println( "父類--初始化塊" );
    }
        /* 構造器 */
    public Parent()
    {
        System.out.println( "父類--構造器" );
        System.out.println( "i=" + i + ", j=" + j );
        j = 20;
    }
}

public class SubClass extends Parent {
         /* 靜態變量 */
    public static String s_StaticField = "子類--靜態變量";
         /* 變量 */
    public String s_Field = "子類--變量";
        /* 靜態初始化塊 */
    static {
        System.out.println( s_StaticField );
        System.out.println( "子類--靜態初始化塊" );
    }
       /* 初始化塊 */
    {
        System.out.println( s_Field );
        System.out.println( "子類--初始化塊" );
    }
       /* 構造器 */
    public SubClass()
    {
        System.out.println( "子類--構造器" );
        System.out.println( "i=" + i + ",j=" + j );
    }


        /* 程序入口 */
    public static void main( String[] args )
    {
        System.out.println( "子類main方法" );
        new SubClass();
    }
}

 

上面的初始化結果是:

  • 父類--靜態變量

  • 父類--靜態初始化塊

  • 子類--靜態變量

  • 子類--靜態初始化塊

  • 子類main方法

  • 父類--變量

  • 父類--初始化塊

  • 父類--構造器

  • i=9, j=0

  • 子類--變量

  • 子類--初始化塊

  • 子類--構造器

  • i=9,j=20

子類的靜態變量和靜態初始化塊的初始化是在父類的變量、初始化塊和構造器初始化之前就完成了。靜態變量、靜態初始化塊,變量、初始化塊初始化了順序取決於它們在類中出現的先后順序

 

例子(必看)

看 [Java對象的初始化] 小節 https://segmentfault.com/a/1190000009707894  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM