日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

java顺序结构类型,Java类的完整构造执行顺序

發(fā)布時(shí)間:2024/10/5 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java顺序结构类型,Java类的完整构造执行顺序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這里只說(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。