java物件的初始化順序

2021-05-24 15:47:09 字數 2475 閱讀 2411

物件初始化流程:

我們根據一段**來分析物件初始化流程:

/***

基類包含一靜態變數、包含一例項變數 *

包含乙個靜態初始化塊以及乙個構造子 */

class base

public base()

}/**

*一級子類和基類包含的內容一樣

**/class superclass extends base

static

public static int getsuperstaticnumber()

public int getsuperinstancenumber()

}/**

*二級子類為測試該**的驅動類 */

public class subclass extends superclass

public static int getstaticnumber()

public int getinstancenumber()

public static voidmain(string args)

static }

這段**會有以下輸出:

static init base 10

static member init

static init superclass 100

static member init sub

static init 1000

init base 20

instance member init

init superclass 200

instance member init sub

init subclass 2000

[1]物件在初始化過程,

jvm會先去搜尋該類的頂級父類,直到搜尋到我們所定義的

subclass

繼承樹上直接繼承於

object

類的子類,在這裡就是

base

類;[2]

然後jvm

會先載入

base

類,然後初始化

base

類的靜態變數

a,然後執行

base

類的靜態初始化塊,按照這樣第一句話會輸出:

static init base 10【*

:此時該類還未呼叫建構函式,建構函式是例項化的時候呼叫的】

[3]然後jvm

base

類的子類,按照靜態成員函式->

靜態成員變數

->靜態初始化塊

[4]類載入完了過後開始對類進行例項化操作,這個過程還是會先搜尋到直接繼承於

object

類的子類,在這裡就是

base類;

[5]jvm

會例項化

base

類的成員函式,然後例項化成員變數,最後呼叫

base

類的建構函式;

[6]之後,jvm

會遞迴往繼承樹下邊進行呼叫,順序還是遵循:成員函式->

成員變數

->建構函式

[7]最後直到

subclass

類的構造函式呼叫完成

按照上邊書寫的邏輯,我們就很清楚了上邊源**的執行結果,而整個

jvm初始化某個類的流程就是按照以上邏輯進行

在構造函式呼叫過程,有幾點是需要我們留意的,這裡就不提供**例項,有興趣的朋友可以自己去試試

[1]如果乙個類的父類沒有無引數建構函式,也就是說父類自定義了乙個帶引數的建構函式,那麼系統不會提供無引數建構函式,此時子類在呼叫建構函式的時候必須最開始顯示呼叫

super(param)

,因為在構造函式呼叫之前系統總會先去呼叫父類的建構函式

[2]若乙個類定義的時候沒有提供建構函式,

jvm會自動為該類定義乙個無引數的建構函式

[3]乙個類在呼叫建構函式的時候,

jvm隱藏了一句**

super()

,前提是父類未定義建構函式或者顯示定義了無參建構函式;其含義就是呼叫父類的建構函式,如果父類的無引數建構函式被覆蓋的話需要在子類建構函式中顯示呼叫父類帶引數的建構函式

[4]當類中的成員函式遇到變數的時候,會先根據變數名在函式域即區域性變數範圍內去尋找該變數,如果找不到才會去尋找例項變數或者靜態變數,其意思可以理解為區域性變數可以和例項變數或者靜態變數同名,而且會在函式呼叫過程優先使用,這個原因在於在函式範圍內,如果呼叫的變數是例項變數,其中字首

this.被隱藏了。

**:

java 物件屬性初始化順序

a 類的初始化 順序如下 為靜態屬性分配記憶體並賦值 後面大括號語句不執行,這裡是初始化,只是新增變數和值 或 執行靜態 塊 立刻執行大括號裡面的語句 為什麼這樣說呢,因為誰在前先載入誰,包括靜態屬性之間,和靜態塊之間的順序,但是注意,雖然順序都可以當第一,但是靜態塊 靜態屬性執行的東西完全不一樣,...

java類物件的初始化順序

類物件的初始化順序 1.static成員變數預設初始化 2.static塊初始化 3.例項成員變數預設初始化 4.例項塊初始化 5.建構函式 或1.static塊初始化 2.static成員變數預設初始化 3.例項塊初始化 4.例項成員變數預設初始化 5.建構函式 測試 class date dat...

java初始化順序

1 父類靜態成員和靜態初始化塊 按在 中出現的順序依次執行 2 子類靜態成員和靜態初始化塊 按在 中出現的順序依次執行 3 父類例項成員和例項初始化塊 按在 中出現的順序依次執行 4 父類構造方法 5 子類例項成員和例項初始化塊 按在 中出現的順序依次執行 6 子類構造方法 public abstr...