其中:靜態成員和static塊初始化按照出現的順序,普通成員初始化和非static塊也按照順序。
父類上層還有父類時,總是先執行最頂層父類的static-->派生類static-->派生類static-->.......-->子類static-->頂層父類的其他成員變數-->父類構造方法--> 派生類的其他成員變數 --> 派生類構造方法--> ...............-->子類其他成員變數-->子類構造方法
publicclass
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 成員類物件建構函式如果有多個成員類...