日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java類的實例化順序

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

問題描述

在驗證《Core Java》第9版4-5代碼時,發現程序輸出結果和自己理解的不太一樣。

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());} }}

以下是輸出結果:

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

根據第一條語句得出靜態初始化塊生成的nextId為6943,然后在初始化塊中id被賦值為6943,nextId自增后為6944。再執行第一個構造函數;

那么對于第二個對象來說,就應該直接執行初始化塊,此時id為6944,nextId自增為6945。再執行第二個構造函數,此時this('Employee #' + nextId, salary);語句中的nextId應該為6945,為什么輸出結果為6944呢?

問題解答

回答1:

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

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

正常來說,java 編譯器會把實例初始化塊復制構造方法中,具體位置在調用父類的構造方法以后,構造方法里面的語句之前,但是存在例外情況。Java 官方的 Tutorials 里說初始化塊會被復制到每個構造方法里面其實是不嚴謹的。

具體到這個例子,需要考慮一個問題,如果編譯器把初始化塊復制到每個構造方法里面,那么對于在構造方法里面調用了其他構造方法的情況,這個初始化塊就會執行兩次,就像例子里面的

public Employee(double salary) {this('Employee #' + nextId, salary); // 調用了另一個構造方法}

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

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

輸出結果就會變為

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

而修改之前的情況,反編譯下 class 文件就能看出來編譯器最后的輸出結果,這里只貼三個構造方法,可以很明顯的看出來,第二個構造方法并沒有被復制初始化塊的內容,直接調用了另一個構造方法。

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

標簽: java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产欧美丝祙| 久久国产免费| 天堂成人国产精品一区| 国产高清久久| 日韩欧美一区二区三区在线观看| 欧美激情另类| 日韩欧美1区| 日韩免费福利视频| 欧美日韩在线网站| 日韩专区欧美专区| 欧美亚洲tv| 国产精东传媒成人av电影| 麻豆国产91在线播放| 91亚洲人成网污www| 999精品一区| 三级在线观看一区二区| 欧美一级一区| 卡一精品卡二卡三网站乱码| 日韩电影免费网址| 亚洲a一区二区三区| 黄色成人91| 日韩精品成人| 精品久久中文| 亚洲午夜黄色| 亚洲区欧美区| 麻豆传媒一区二区三区| 欧美精品资源| 精品1区2区3区4区| 日韩三级久久| 国产一区二区视频在线看| 久久久亚洲一区| 最新国产精品视频| 精品国产乱码久久久久久1区2匹| 亚洲va在线| 中文视频一区| 久久99青青| 精品一区在线| 蜜臀久久99精品久久久画质超高清| 国产精品调教视频| 久久激情婷婷| 亚洲bt欧美bt精品777| 国产一区二区三区四区五区| 婷婷亚洲综合| 国产精品大片免费观看| 久久国产直播| 91精品国产自产精品男人的天堂| 色偷偷色偷偷色偷偷在线视频| 蜜桃91丨九色丨蝌蚪91桃色| 久久精品系列| 99精品综合| 日韩福利视频导航| 色婷婷精品视频| 日韩综合小视频| 欧美aa在线观看| 亚洲精品系列| 成人午夜精品| 91精品啪在线观看国产爱臀| 亚洲二区免费| 国产精品porn| 老司机精品久久| 色婷婷亚洲mv天堂mv在影片| 亚洲在线久久| 亚洲天堂1区| 国产精品蜜月aⅴ在线| 久久影视一区| 国产精品久久久久9999高清| 午夜欧美视频| 成人午夜毛片| 日韩黄色在线观看| 日本一二区不卡| 日韩高清在线一区| 在线视频观看日韩| 卡一卡二国产精品| 一区二区精彩视频| 美女网站视频一区| 国产精品theporn| 亚洲日本在线观看视频| 久久久久免费av| 精品九九久久| 日韩不卡一区二区| 中文日韩欧美| 久久精品亚洲人成影院 | 蜜桃视频欧美| 久久一区国产| 日本va欧美va瓶| 欧美日韩一二三四| 精品国产黄a∨片高清在线| 天堂精品久久久久| 夜夜精品视频| 久久久精品午夜少妇| 久久精品女人| 国产精品videossex| 亚洲我射av| 欧美日韩精品一本二本三本| 精品免费av在线| 国产精品久久久久久久久久10秀 | 亚洲天堂一区二区| 精品三级av在线导航| 国产欧美精品久久| 亚洲精品国产精品粉嫩| 香蕉视频成人在线观看| 婷婷中文字幕一区| 岛国精品一区| 精品国产亚洲一区二区三区在线| 97久久亚洲| 亚洲a级精品| 亚洲精品伊人| 丝袜美腿高跟呻吟高潮一区| 免费毛片在线不卡| 国户精品久久久久久久久久久不卡| 91亚洲国产高清| 久久精品一区| 精品视频在线你懂得| 欧美精品91| 国产精品videosex极品| 国产精品日韩精品在线播放| 青青青国产精品| 在线精品国产亚洲| 亚洲另类视频| 97se亚洲| 欧美激情福利| 日本一二区不卡| 中文字幕高清在线播放| 日韩成人亚洲| 欧美69视频| 国产偷自视频区视频一区二区| 麻豆精品91| 婷婷精品久久久久久久久久不卡| 亚洲综合色婷婷在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅 | 三级欧美在线一区| 免费在线成人网| 中文一区一区三区免费在线观 | 精品高清久久| 国产拍在线视频| 久久国产影院| 在线一区欧美| 蜜桃av一区二区三区电影| 日韩欧美另类中文字幕| 国产精品香蕉| 成人国产精品一区二区网站| 久久婷婷亚洲| 日韩精品一级中文字幕精品视频免费观看 | bbw在线视频| 鲁鲁在线中文| 欧美日韩国产在线一区| 免费人成在线不卡| 久久国产精品色av免费看| 欧美aⅴ一区二区三区视频| 日韩av自拍| 国产午夜精品一区二区三区欧美| 日韩免费精品| 美女久久久久久| 欧美日韩视频网站| 亚洲视频播放| 国产亚洲一区| 日韩成人三级| 久久福利精品| 91p九色成人| 成人精品动漫一区二区三区| 婷婷国产精品| 日韩午夜视频在线| 国产精品国产一区| 制服诱惑一区二区| 国产午夜精品一区在线观看| 精品视频高潮| 一区久久精品| 国产欧美在线| 欧美精选视频一区二区| 一区二区精彩视频| 国产一区二区三区日韩精品| 亚洲高清影视| 国产午夜精品一区在线观看| 韩国精品主播一区二区在线观看| 亚洲主播在线| 精品五月天堂| 亚洲深夜av| 久久97视频| 国产视频亚洲| 美女视频黄久久| 99在线|亚洲一区二区| 久久不卡日韩美女| 黄色日韩在线| 麻豆国产精品| 亚洲男女自偷自拍| 国产91在线精品| 亚洲精选av| 啪啪国产精品| 国产毛片一区二区三区| 久久国产中文字幕| 国产毛片一区二区三区| 亚洲激情婷婷| 国产精品久久久久久久久久10秀| 视频一区视频二区中文| 国模精品一区| 亚洲精品美女91| 亚洲成人国产| 国产精品1区| 视频一区视频二区中文字幕| av在线最新|