内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Java子類和父類的初始化執(zhí)行順序-創(chuàng)新互聯(lián)

  要明白子類和父類的初始化執(zhí)行順序,只需要知曉以下三點(diǎn),就不會(huì)再弄錯(cuò)了。

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的仁布網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

  1.創(chuàng)建子類對(duì)象時(shí),子類和父類的靜態(tài)塊和構(gòu)造方法的執(zhí)行順序?yàn)椋焊割愳o態(tài)塊->子類靜態(tài)塊->父類構(gòu)造器->子類構(gòu)造器。深入理解為什么是這個(gè)順序,可以看我這篇文章:從京東面試題看java類和對(duì)象的初始化

  2.靜態(tài)變量的聲明和賦值,聲明會(huì)在靜態(tài)塊之前,賦值運(yùn)算將會(huì)合并到靜態(tài)塊中,順序和源代碼中的順序一致。舉例如下:

  源代碼

  public class P {

  public static int a = 1;

  static {

  int b = 2;

  }

  public static int c = 3;

  }

  在編譯器編譯后,會(huì)變成這樣子

  public class P {

  public static int a;

  public static int c;

  static {

  a = 1;

  int b = 2;

  c = 3;

  }

  }

  我們來(lái)看,編譯后的字節(jié)碼是怎樣的,使用命令可以反編譯類的字節(jié)碼:javap -v -p P.class

  {

  public static int a;

  descriptor: I

  flags: ACC_PUBLIC, ACC_STATIC

  public static int c;

  descriptor: I

  flags: ACC_PUBLIC, ACC_STATIC

  static {};

  descriptor: ()V

  flags: ACC_STATIC

  Code:

  stack=1, locals=1, args_size=0

  0: iconst_1

  1: putstatic #2 // Field a:I

  4: iconst_2

  5: istore_0

  6: iconst_3

  7: putstatic #3 // Field c:I

  10: return

  }

  我去掉了編譯器生成的構(gòu)造方法以及一些無(wú)關(guān)信息,我們可以看到字節(jié)碼中,a、c的聲明在前面(其實(shí)這個(gè)不是重點(diǎn)),在static{}塊中,pc 0~1兩個(gè)指令,為靜態(tài)字段a賦值1,pc 4~5兩個(gè)指令,為第一個(gè)局部變量,也就是變量b賦值2,pc 6~7兩個(gè)指令,為靜態(tài)字段c賦值3。可以看到合并后的static塊,a的賦值在原靜態(tài)塊代碼之前,c的賦值在原靜態(tài)塊代碼之后,這個(gè)順序和源代碼中ac的聲明順序一致。

  3.成員變量的聲明和賦值,與靜態(tài)變量相同的是成員變量的賦值也會(huì)合并到構(gòu)造器中,不同的是合并后的順序,成員變量的賦值是在構(gòu)造器的前面。舉例如下:

  源代碼 鄭州專業(yè)婦科醫(yī)院 http://www.hnzzkd.com/

  public class P {

  public int a = 1;

  public P() {

  int b = 2;

  }

  public int c = 3;

  }

  編譯后的代碼,會(huì)像這個(gè)樣子

  public class P {

  public int a;

  public int c;

  public P() {

  a = 1;

  c = 3;

  int b = 2;

  }

  }

  再來(lái)看看編譯后的字節(jié)碼是怎樣的

  public int a;

  descriptor: I

  flags: ACC_PUBLIC

  public int c;

  descriptor: I

  flags: ACC_PUBLIC

  public P();

  descriptor: ()V

  flags: ACC_PUBLIC

  Code:

  stack=2, locals=2, args_size=1

  0: aload_0

  1: invokespecial #1 // Method java/lang/Object."":()V

  4: aload_0

  5: iconst_1

  6: putfield #2 // Field a:I

  9: aload_0

  10: iconst_3

  11: putfield #3 // Field c:I

  14: iconst_2

  15: istore_1

  16: return

  字段a和c的聲明在前面,然后看構(gòu)造器P()的字節(jié)碼,pc 0~1兩個(gè)指令,是先調(diào)用P的父類Object的構(gòu)造器,字節(jié)碼中的構(gòu)造器方法使用來(lái)表示的。pc 4~6三個(gè)指令,為成員變量a賦值1。pc9~11三個(gè)指令,為成員變量c賦值3,pc 14~15兩個(gè)指令,為下表為1的局部變量賦值為2,也就是局部變量b=2。所以可以看出,成員變量賦值邏輯合并到構(gòu)造器后,是在調(diào)用父類構(gòu)造器之后,原有構(gòu)造器代碼之前。

  回過(guò)頭來(lái),你明白了子類父類初始化各個(gè)方法的執(zhí)行順序,而字段的初始化賦值也是合并到方法里,所以創(chuàng)建子類對(duì)象時(shí),子類父類各個(gè)部分的執(zhí)行順序都已了然。

  總結(jié):

  1.講解了子類父類初始化時(shí)方法執(zhí)行順序,包括的靜態(tài)塊和構(gòu)造器方法,靜態(tài)塊也是方法,靜態(tài)塊在jvm中的方法名叫。

  2.講解了字段的賦值是如何合并到方法中,靜態(tài)字段賦值合并到靜態(tài)塊中,成員變量賦值合并到構(gòu)造器方法中。

文章名稱:Java子類和父類的初始化執(zhí)行順序-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://www.rwnh.cn/article20/csgpco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)軟件開(kāi)發(fā)、服務(wù)器托管、動(dòng)態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、營(yíng)銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
灌云县| 淮南市| 阳高县| 崇文区| 葵青区| 连云港市| 乐东| 浦东新区| 乐昌市| 东莞市| 昭通市| 开鲁县| 象山县| 清徐县| 北安市| 闸北区| 新巴尔虎右旗| 崇仁县| 兴和县| 中牟县| 兰考县| 阜新| 东兰县| 山东省| 德保县| 博客| 民权县| 阜阳市| 石景山区| 甘孜县| 浙江省| 高密市| 鹤山市| 北碚区| 舒城县| 娄底市| 基隆市| 周口市| 古丈县| 阜新| 宜良县|