成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java類的實(shí)例化順序

瀏覽:166日期:2024-02-10 11:57:39

問(wèn)題描述

在驗(yàn)證《Core Java》第9版4-5代碼時(shí),發(fā)現(xiàn)程序輸出結(jié)果和自己理解的不太一樣。

import java.util.Random;class Employee { private static int nextId; private int id; private String name = ''; private double salary; static {Random generator = new Random();nextId = generator.nextInt(10000); } {id = nextId;nextId++; } public Employee(String name, double salary) {this.name = name;this.salary = salary; } public Employee(double salary) {this('Employee #' + nextId, salary); } public Employee() { } public String getName() {return name; } public double getSalary() {return salary; } public int getId() {return id; }}public class ConstructorTest { public static void main(String[] args) {Employee[] staff = new Employee[3];staff[0] = new Employee('Harry', 40000);staff[1] = new Employee(60000);staff[2] = new Employee();for (Employee e : staff) { System.out.println('id = ' + e.getId() + ', name = ' + e.getName() + ', salary = ' + e.getSalary());} }}

以下是輸出結(jié)果:

id = 6943, name = Harry, salary = 40000.0id = 6944, name = Employee #6944, salary = 60000.0id = 6945, name = , salary = 0.0

根據(jù)第一條語(yǔ)句得出靜態(tài)初始化塊生成的nextId為6943,然后在初始化塊中id被賦值為6943,nextId自增后為6944。再執(zhí)行第一個(gè)構(gòu)造函數(shù);

那么對(duì)于第二個(gè)對(duì)象來(lái)說(shuō),就應(yīng)該直接執(zhí)行初始化塊,此時(shí)id為6944,nextId自增為6945。再執(zhí)行第二個(gè)構(gòu)造函數(shù),此時(shí)this('Employee #' + nextId, salary);語(yǔ)句中的nextId應(yīng)該為6945,為什么輸出結(jié)果為6944呢?

問(wèn)題解答

回答1:

這個(gè)類初始化的順序確實(shí)是個(gè)神奇的問(wèn)題,只可根據(jù)結(jié)果去理解。我打了個(gè)斷點(diǎn)去測(cè)試,staff[0] = new Employee('Harry', 40000);和staff[2] = new Employee();都是代碼塊先于構(gòu)造方法執(zhí)行,但staff[1] = new Employee(60000);卻先執(zhí)行走到this('Employee #' + nextId, salary);,然后代碼塊,然后public Employee(String name, double salary)構(gòu)造函數(shù)。如果你使用2,則按你的預(yù)期,代碼塊先于構(gòu)造方法。

public Employee(double salary) { // 1 this('Employee #' + nextId, salary); // 2// this.name = 'Employee #' + nextId; // this.salary = salary;}回答2:

正常來(lái)說(shuō),java 編譯器會(huì)把實(shí)例初始化塊復(fù)制構(gòu)造方法中,具體位置在調(diào)用父類的構(gòu)造方法以后,構(gòu)造方法里面的語(yǔ)句之前,但是存在例外情況。Java 官方的 Tutorials 里說(shuō)初始化塊會(huì)被復(fù)制到每個(gè)構(gòu)造方法里面其實(shí)是不嚴(yán)謹(jǐn)?shù)摹?/p>

具體到這個(gè)例子,需要考慮一個(gè)問(wèn)題,如果編譯器把初始化塊復(fù)制到每個(gè)構(gòu)造方法里面,那么對(duì)于在構(gòu)造方法里面調(diào)用了其他構(gòu)造方法的情況,這個(gè)初始化塊就會(huì)執(zhí)行兩次,就像例子里面的

public Employee(double salary) {this('Employee #' + nextId, salary); // 調(diào)用了另一個(gè)構(gòu)造方法}

如果編譯器把初始化塊里的代碼復(fù)制到了public Employee(double salary)和public Employee(String name, double salary)里面,這個(gè)初始化塊就會(huì)執(zhí)行兩次,為了避免這種情況,編譯器作了一個(gè)簡(jiǎn)單的處理,編譯器發(fā)現(xiàn)public Employee(double salary)調(diào)用了本類的另一個(gè)構(gòu)造方法,就沒(méi)有把初始化塊的代碼拷貝到這個(gè)構(gòu)造方法里面。也就是說(shuō)在初始化第二個(gè)對(duì)象的時(shí)候,這個(gè)初始化塊是推遲到調(diào)用this('Employee #' + nextId, salary);后,在執(zhí)行Employee(String name, double salary)的時(shí)候才執(zhí)行的,由于推遲了初始化塊的執(zhí)行,在決定傳遞的參數(shù) nextId 的時(shí)候,仍然是未自增的值。如果把這個(gè)構(gòu)造方法修改為

public Employee(double salary) { // this('Employee #' + nextId, salary); this.name = 'Employee #' + nextId; this.salary = salary;}

輸出結(jié)果就會(huì)變?yōu)?/p>

id = 5473, name = Harry, salary = 40000.0id = 5474, name = Employee #5475, salary = 60000.0id = 5475, name = , salary = 0.0

而修改之前的情況,反編譯下 class 文件就能看出來(lái)編譯器最后的輸出結(jié)果,這里只貼三個(gè)構(gòu)造方法,可以很明顯的看出來(lái),第二個(gè)構(gòu)造方法并沒(méi)有被復(fù)制初始化塊的內(nèi)容,直接調(diào)用了另一個(gè)構(gòu)造方法。

public Employee(java.lang.String, double); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object.'<init>':()V 4: aload_0 5: ldc #2 // String 7: putfield #3 // Field name:Ljava/lang/String; 10: aload_0 11: getstatic #4 // Field nextId:I 14: putfield #5 // Field id:I 17: getstatic #4 // Field nextId:I 20: iconst_1 21: iadd 22: putstatic #4 // Field nextId:I 25: aload_0 26: aload_1 27: putfield #3 // Field name:Ljava/lang/String; 30: aload_0 31: dload_2 32: putfield #6 // Field salary:D 35: return public Employee(double); Code: 0: aload_0 1: new #7 // class java/lang/StringBuilder 4: dup 5: invokespecial #8 // Method java/lang/StringBuilder.'<init>':()V 8: ldc #9 // String Employee # 10: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 13: getstatic #4 // Field nextId:I 16: invokevirtual #11 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 19: invokevirtual #12 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 22: dload_1 23: invokespecial #13 // Method '<init>':(Ljava/lang/String;D)V 26: return public Employee(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object.'<init>':()V 4: aload_0 5: ldc #2 // String 7: putfield #3 // Field name:Ljava/lang/String; 10: aload_0 11: getstatic #4 // Field nextId:I 14: putfield #5 // Field id:I 17: getstatic #4 // Field nextId:I 20: iconst_1 21: iadd 22: putstatic #4 // Field nextId:I 25: return

標(biāo)簽: java
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
日韩视频123| 中文字幕亚洲一区二区va在线| 538在线一区二区精品国产| 亚洲综合色噜噜狠狠| 国产综合欧美| 中文字幕一区二区三中文字幕| 午夜日韩视频| 国产欧美一区二区三区在线老狼| 波多野结衣精品在线| 欧美精品乱码久久久久久| 美女一区二区视频| 在线观看一区二区精品视频| 青青草97国产精品免费观看| 可以免费看不卡的av网站| 亚洲电影一级黄| 亚洲欧美成人| 亚洲福中文字幕伊人影院| 亚洲一区视频| 亚洲一区二区在线免费观看视频 | 亚洲国产毛片aaaaa无费看| 一区二区av| 首页综合国产亚洲丝袜| 久久青青草综合| 美女尤物国产一区| 欧美男同性恋视频网站| 国产美女精品在线| 欧美一卡二卡三卡四卡| 国产风韵犹存在线视精品| 91精品国产综合久久精品麻豆| 极品瑜伽女神91| 欧美精品日日鲁夜夜添| 国产一区不卡精品| 欧美电影免费提供在线观看| 欧美暴力喷水在线| 国产精品五月天| 一本不卡影院| 亚洲国产欧美另类丝袜| 色呦呦国产精品| 精品中文字幕一区二区小辣椒 | 国产女人18水真多18精品一级做| 午夜久久影院| 夜夜亚洲天天久久| 在线精品亚洲一区二区不卡| 激情综合一区二区三区| 日韩限制级电影在线观看| 国产成人精品三级麻豆| 久久在线观看免费| 亚洲黄色成人久久久| 亚洲线精品一区二区三区八戒| 日本道在线观看一区二区| 精品中文字幕一区二区小辣椒| 日韩视频国产视频| 韩国亚洲精品| 亚洲成人一区二区在线观看| 欧美日韩亚洲另类| 91在线播放网址| 亚洲卡通动漫在线| 欧美三级韩国三级日本三斤| 99re66热这里只有精品3直播 | 精品一区二区三区在线播放视频| 欧美一区二区三区在| 午夜激情一区| 亚洲电影一级黄| 欧美一级高清大全免费观看| 午夜天堂精品久久久久| 亚洲国产sm捆绑调教视频 | 樱桃国产成人精品视频| 欧洲av在线精品| 成人精品视频.| 日韩伦理免费电影| 日本高清无吗v一区| 成人一区二区三区视频| 国产精品成人免费精品自在线观看| 久久婷婷麻豆| av电影天堂一区二区在线| 亚洲三级电影网站| 欧美日韩精品欧美日韩精品一综合| 99久久精品免费看国产免费软件| 亚洲日本欧美天堂| 欧美日韩你懂的| 欧美午夜a级限制福利片| 婷婷六月综合亚洲| 欧美在线色视频| 国产一区久久| 男人的天堂亚洲一区| 久久影院午夜论| 久久午夜电影| 92国产精品观看| 亚洲成国产人片在线观看| 精品国产乱码久久久久久免费 | 亚洲视频一区二区在线观看| 欧美三区在线观看| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 亚洲精选视频免费看| 一本一道波多野结衣一区二区| 成人免费福利片| 一区二区三区国产精品| 欧美成人官网二区| 欧洲一区在线电影| 精品91视频| 成人的网站免费观看| 亚洲一二三四在线观看| 久久免费精品国产久精品久久久久| 亚洲主播在线| 91在线精品一区二区| 视频精品一区二区| 国产日本一区二区| 欧美在线你懂得| 激情综合电影网| 国产999精品久久久久久绿帽| 亚洲成av人片| 国产精品对白交换视频| 日韩免费观看高清完整版| 老妇喷水一区二区三区| 在线成人亚洲| 99久久99久久精品免费观看 | 国产欧美日韩伦理| 91丝袜高跟美女视频| 九九视频精品免费| 亚洲一区二区三区四区五区黄| 2020国产精品自拍| 欧美三级蜜桃2在线观看| 99在线视频精品| 久久精品国产免费| 亚洲地区一二三色| 国产精品久久国产精麻豆99网站| 4438x成人网最大色成网站| 免费在线一区二区| 精品91视频| 欧美激情第二页| 成人福利在线看| 国产一区二区不卡| 麻豆久久一区二区| 性做久久久久久免费观看欧美| 最新不卡av在线| 国产欧美精品一区aⅴ影院| 国产一区久久久| 玉足女爽爽91| 中文字幕精品一区| 久久综合一区二区| 日韩一区二区精品| 精品视频资源站| 色天使色偷偷av一区二区| 亚洲一区二区伦理| 亚洲精品欧美| 好看的亚洲午夜视频在线| 91丝袜美女网| 成人sese在线| 丁香激情综合国产| 国产a级毛片一区| 国产精一品亚洲二区在线视频| 奇米一区二区三区av| 天天爽夜夜爽夜夜爽精品视频| 亚洲激情欧美激情| 亚洲免费观看高清完整版在线观看熊 | 久久综合成人精品亚洲另类欧美| 欧美一区二区视频在线观看2020| 欧美日韩视频第一区| 91久久一区二区| 色播五月激情综合网| 色婷婷国产精品| 日本福利一区二区| 日本高清不卡aⅴ免费网站| 91福利在线免费观看| 91久久线看在观草草青青| 色激情天天射综合网| 色婷婷久久久亚洲一区二区三区| 色综合久久99| 色视频一区二区| 欧美色电影在线| 欧美日韩精品一区二区天天拍小说 | 久久久精品免费网站| 久久久99免费| 日本一区二区动态图| 日本一区二区三区四区| 国产精品无遮挡| 中文字幕五月欧美| 中文字幕一区二区三| 亚洲摸摸操操av| 亚洲国产精品久久人人爱| 日韩中文字幕亚洲一区二区va在线| 水野朝阳av一区二区三区| 久久精品国产亚洲高清剧情介绍 | 欧美日韩一区在线播放| 欧美少妇一区| 91久久国产自产拍夜夜嗨| 国产日韩一区二区三区在线| 久久成人精品| 欧美日韩高清一区二区不卡| 日韩午夜在线播放| 久久久精品一品道一区| 国产精品国产自产拍高清av王其 | 国产日韩欧美高清在线| 国产精品欧美极品| 国产精品久久久久影院亚瑟| 亚洲精选免费视频| 日韩在线观看一区二区| 国产一区二区三区香蕉| 粉嫩高潮美女一区二区三区| 女同性一区二区三区人了人一|