[java] 類變量初始化順序

前言

 本博客旨在深刻了解類變量的初始化,若是有分析錯誤的地方,但願獲得各位大牛的指正.java

類成員變量

類的成員變量分爲兩種: 普通成員變量 和 靜態成員變量 spa

  •  普通成員變量 :它被存儲在 堆內存 中,每一個對象都有本身的一個變量
  •  靜態成員變量 :使用 static 關鍵詞修飾的成員變量,它被存儲在 靜態方法區 ,該類的全部對象都共享這個變量

成員變量的初始化

類的成員變量初始化地點有三處:code

  • 聲明時初始化
  • 代碼塊中初始化
  • 構造器中初始化

成員變量初始化順序

成員變量初始化順序

讓咱們來看下面的一段代碼:對象

CommonMemberVariableTest.java:blog

public class CommonMemberVariableTest {
    public static void main(String ...agrs) {
        CommonMemberVariable commonMemberVariable = new CommonMemberVariable();
    }
}

class ParentCommonMemberVariable {
    private Variable1 parentVariable1 = new Variable1("parent v1 statement");
    private Variable1 parentVariable2 = new Variable1("parent v2 statement");

    private static Variable1 parentStaticVariable1 = new Variable1("static parent v1 statement");
    private static Variable1 parentStaticVariable2 = new Variable1("static parent v2 statement");

    {
        parentVariable1 = new Variable1("parent v1 code block");
    }

    static {
        parentStaticVariable1 = new Variable1("static parent v1 code block");
    }

    public ParentCommonMemberVariable() {
        parentVariable1 = new Variable1("parent v1 constructor");
    }
}

class CommonMemberVariable extends ParentCommonMemberVariable {
    private Variable1 variable1 = new Variable1("v1 statement");
    private Variable1 variable2 = new Variable1("v2 statement");
    private static Variable1 staticVariable1 = new Variable1("static v1 statement");
    private static Variable1 staticVariable2 = new Variable1("static v2 statement");


    {
        variable1 = new Variable1("v1 code block");
    }

    static {
        staticVariable1 = new Variable1("static v1 code block");
    }

    public CommonMemberVariable() {
        variable1 = new  Variable1("v1 constructor");
    }
}

class Variable1 {
    public Variable1(String info) {
        System.out.println(info);
    }

 

 

 

上面代碼的執行結果以下:繼承

 
 

static parent v1 statement
static parent v2 statement
static parent v1 code block
static v1 statement
static v2 statement
static v1 code block
parent v1 statement
parent v2 statement
parent v1 code block
parent v1 constructor
v1 statement
v2 statement
v1 code block
v1 constructor 內存

 

結論:博客

  •  當咱們只看 variable1 這個成員變量時,從打印能夠發現,普通成員變量的初始化執行順序是 聲明時初始化 -> 代碼塊中初始化 ->構造器中初始化 
  • 當咱們的類種有多個普通成員變量時,那麼多個普通成員變量的初始化順序是按照從上往下的順序進行初始化
  • 若是咱們只看子類或者父類的普通成員變量和靜態成員變量,則會發現靜態成員變量的初始化要先於普通成員變量,而且靜態成員變量的初始化於普通成員變量的初始化順序保持一致
  • 當咱們的類種有繼承關係時,那初始化的順序爲 父類靜態變量聲明時 -> 父類靜態代碼塊 -> 子類靜態變量聲明時 -> 子類靜態代碼塊 -> 父類普通成員變量聲明時 -> 父類代碼塊 -> 父類構造器 -> 子類普通成員變量聲明時 -> 子類代碼塊 -> 子類構造器 
相關文章
相關標籤/搜索