java顺序结构类型,Java类的完整构造执行顺序
這里只說(shuō)一個(gè)完整的結(jié)果,至于為什么是這樣的順序,可以參考我以前的文章:深入剖析java類的構(gòu)造方式
如果父類有靜態(tài)成員賦值或者靜態(tài)初始化塊,執(zhí)行靜態(tài)成員賦值和靜態(tài)初始化塊
如果類有靜態(tài)成員賦值或者靜態(tài)初始化塊,執(zhí)行靜態(tài)成員賦值和靜態(tài)初始化塊
將類的成員賦予初值(原始類型的成員的值為規(guī)定值,例如int型為0,float型為0.0f,boolean型為false;對(duì)象類型的初始值為null)
如果構(gòu)造方法中存在this()調(diào)用(可以是其它帶參數(shù)的this()調(diào)用)則執(zhí)行之,執(zhí)行完畢后進(jìn)入第7步繼續(xù)執(zhí)行,如果沒(méi)有this調(diào)用則進(jìn)行下一步。(這個(gè)有可能存在遞歸調(diào)用其它的構(gòu)造方法)
執(zhí)行顯式的super()調(diào)用(可以是其它帶參數(shù)的super()調(diào)用)或者隱式的super()調(diào)用(缺省構(gòu)造方法),此步驟又進(jìn)入一個(gè)父類的構(gòu)造過(guò)程并一直上推至Object對(duì)象的構(gòu)造。
執(zhí)行類申明中的成員賦值和初始化塊。
執(zhí)行構(gòu)造方法中的其它語(yǔ)句。
其中第4步是比較麻煩的,因?yàn)閠his調(diào)用實(shí)際上會(huì)調(diào)用類的另外一個(gè)構(gòu)造方法,最終應(yīng)該是執(zhí)行類的某個(gè)構(gòu)造方法,它可能會(huì)顯示的調(diào)用super,但是無(wú)論是否調(diào)用super,最終都是執(zhí)行super的,也就是父類的構(gòu)造方法并一直這樣遞歸到Object,所以在子類和父類的構(gòu)造中,首先構(gòu)造或者說(shuō)執(zhí)行的是父類的構(gòu)造,但是它是由子類的構(gòu)造方法調(diào)用的,先于構(gòu)造方法的方法體里面的內(nèi)容,這個(gè)是由編譯器決定的。所以我感覺(jué)簡(jiǎn)單直觀一些的順序表述應(yīng)該是:
如果父類有靜態(tài)成員賦值或者靜態(tài)初始化塊,執(zhí)行靜態(tài)成員賦值和靜態(tài)初始化塊
如果類有靜態(tài)成員賦值或者靜態(tài)初始化塊,執(zhí)行靜態(tài)成員賦值和靜態(tài)初始化塊
將類的成員賦予初值(原始類型的成員的值為規(guī)定值,例如int型為0,float型為0.0f,boolean型為false;對(duì)象類型的初始值為null)
執(zhí)行構(gòu)造方法,并可能遞歸調(diào)用this(),最終先執(zhí)行父類的構(gòu)造方法并一直遞歸到Object的構(gòu)造方法的執(zhí)行
父類的構(gòu)造方法執(zhí)行完成后,執(zhí)行類申明中的成員賦值和初始化塊。
執(zhí)行構(gòu)造方法中的其它語(yǔ)句。
最終的簡(jiǎn)化順序版本是:
父類的靜態(tài)成員賦值和靜態(tài)塊
子類的靜態(tài)成員和靜態(tài)塊
父類的構(gòu)造方法
父類的成員賦值和初始化塊
父類的構(gòu)造方法中的其它語(yǔ)句
子類的成員賦值和初始化塊
子類的構(gòu)造方法中的其它語(yǔ)句
2006年11月16日更新:
針對(duì)留言中提到的那個(gè)文章中的問(wèn)題發(fā)現(xiàn)這個(gè)順序也是有不足的情況,這個(gè)順序是一般的順序,但是有可能被打破,留言中的那篇文章就是一個(gè)例子,因?yàn)樵趫?zhí)行靜態(tài)初始化塊的時(shí)候先執(zhí)行了類的構(gòu)造,打破了這個(gè)一般順序。所以這個(gè)順序有個(gè)前提就是靜態(tài)賦值和初始化塊中沒(méi)有對(duì)本類的實(shí)例化語(yǔ)句。
對(duì)于那個(gè)文章中的問(wèn)題,作者最后的解決方法可行,但是不見(jiàn)得是最好的,可以簡(jiǎn)單的修改靜態(tài)賦值和靜態(tài)初始化塊的順序,修改后的代碼片斷為:
public class CachingEnumResolver {
private static Map CODE_MAP_CACHE;
/*MSGCODE->Category內(nèi)存索引*/
static {
CODE_MAP_CACHE = new HashMap();
//為了說(shuō)明問(wèn)題,我在這里初始化一條數(shù)據(jù)
CODE_MAP_CACHE.put("0","北京市");
}
//單態(tài)實(shí)例 一切問(wèn)題皆由此行引起
private static final CachingEnumResolver SINGLE_ENUM_RESOLVER = new??? CachingEnumResolver();
2006年11月28日更新:
最后做為是否理解了這個(gè)順序的測(cè)試,看看你能不能得到下面的Main類的輸出:
public class Parent {
//private static Parent instance=new Child();
private static String message="Parent Static message";
private String m="Parent instance message";
//private static Parent instance=new Child();
static {
System.out.println("Parent static block");
System.out.println(message);
}
{
System.out.println("Parent instance block");
System.out.println(m);
}
//private static Parent instance=new Child();
public Parent() {
System.out.println("Parent construtor");
}
}
public class Child extends Parent{
private static String message="Child Static message";
private String m="Child instance message";
static {
System.out.println("Child static block");
System.out.println(message);
}
{
System.out.println("Child instance block");
System.out.println(m);
}
public Child() {
System.out.println("Child construtor");
}
}
public class Main {
public static void main(String[] args) {
Child child=new Child();
}
}
另外請(qǐng)注意Parent類有三行注釋掉的代碼,每次取消一行的注釋并重新注釋其它的,輸出又是什么樣的?
(Visited 151 times, 1 visits today)
總結(jié)
以上是生活随笔為你收集整理的java顺序结构类型,Java类的完整构造执行顺序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: matlab 除噪点,MATLAB应用在
- 下一篇: java美元兑换,(Java实现) 美元