構造方法呼叫順序

2022-04-23 17:33:05 字數 1928 閱讀 7227

其中:靜態成員和static塊初始化按照出現的順序,普通成員初始化和非static塊也按照順序。

父類上層還有父類時,總是先執行最頂層父類的static-->派生類static-->派生類static-->.......-->子類static-->頂層父類的其他成員變數-->父類構造方法--> 派生類的其他成員變數 --> 派生類構造方法--> ...............-->子類其他成員變數-->子類構造方法

public

class

test04 ...

public

static

void

main(string args) ...

}我們先預計一下輸出,可能有幾種答案:2和3,3和3,2和2

執行**後:

t2.i1

= 2t2.i2 = 3

其實**的執行順序是這樣的:首先執行給t1,i1,i2分別給予初始值null,0,0,再執行

test04 t1 =new test04(),這樣i1++,i2++被執行,i1,i2都變為1,執行完畢後接著執行int i1; i1,i2的值仍然是1,1,當執行int i2 = 2時i2被賦予了值,即i1 = 1,i2=2;再執行test04 t2 = new test04(),i1,i2再執行++,此時i1 =2,i2 =3,輸出i1,i2,結果就是:t2.i1 = 2,t2.i2 = 3。 通過上面的**我們可以認為系統預設值的給予比通過等號的賦予先執行。再看個擴充套件的例子:

//

aclass

a

public

static

void

sett1(a t1)

public

static

intgeti1()

public

static

void seti1(int

i1)

public

static

intgeti2()

public

static

void seti2(int

i2)

public

a() } //b

class

b //

cclass

c //

test

import

static org.junit.assert.*;

import

org.junit.test;

public

class

test

@test

public

void

testb()

@test

public

void

testc()

}

說明:要區別abc的區別,主要注意靜態成員變數的初始化順序不同,

當private static a t1 = new a()執行之前,i1=0,i2=0;執行之後,i1=1,i2=1;之後執行private static int i1; private static int i2 = 2;i1=1,i2=2;之後a t2 = new a();

當private static b t1 = new b()執行之前,i1=0,i2=2;執行之後,i1=1,i2=3;b t2 = new b();

當private static c t1 = new c()執行之前,i1=0,i2=0;執行之後,i1=1,i2=1;private static int i2 = 2;i1=1,i2=2;c t2 = new c();

Java 構造方法呼叫順序

public class testsuper02 class fatherclass class childclass extends fatherclass 執行結果 開始建立乙個childclass物件 建立fatherclass 建立childclass 要點 關於構造方法結合繼承概念的呼叫,...

構造器呼叫順序

構造器呼叫順序 1 基類建構函式 2 申明順序的成員初始化方法 3 匯出類構造器。class bread class sandwich class cheese class supermeal extends bread class meal extends supermeal public sta...

構造函式呼叫順序

1 建立派生類的物件,基類的建構函式函式優先被呼叫 也優先於派生類裡的成員類 2 如果類裡面有成員類,成員類的建構函式優先被呼叫,靜態成員優先呼叫 3 基類建構函式如果有多個基類則建構函式的呼叫順序是某類在類派生表中出現的 順序而不是它們在成員初始化表中的順序 4 成員類物件建構函式如果有多個成員類...