激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 詳解java中繼承關(guān)系類加載順序問(wèn)題

詳解java中繼承關(guān)系類加載順序問(wèn)題

2020-11-10 16:47jake_fei Java教程

這篇文章主要介紹了詳解java中繼承關(guān)系類加載順序問(wèn)題的相關(guān)資料,需要的朋友可以參考下

詳解java繼承關(guān)系類加載順序問(wèn)題

實(shí)例代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
 * Created by fei on 2017/5/31.
 */
public class SonClass extends ParentClass{
  public SonClass(){
    System.out.println("SonClass's constructor");
  }
  { System.out.println("SonClass's block");}
  static {
    System.out.println("SonClass's static block ");
  }
 
  public static void main(String[] args) {
    System.out.println("------ main start ------ ");
    new SonClass();
    System.out.println("------ main end ------ ");
  }
}
 
class ParentClass{
  public ParentClass(){
    System.out.println("ParentClass's constructor");
  }
  { System.out.println("ParentClass's block");}
  static {
    System.out.println("ParentClass's static block ");
  }
}

運(yùn)行結(jié)果:

?
1
2
3
4
5
6
7
8
ParentClass's static block
SonClass's static block
------ main start ------
ParentClass's block
ParentClass's constructor
SonClass's block
SonClass's constructor
------ main end ------

根據(jù)運(yùn)行結(jié)果,一目了然,在執(zhí)行 main 方法中 new SonClass() 之前,就在類加載之后執(zhí)行了類中 static 代碼塊。然后再進(jìn)入main方法,執(zhí)行new操作,當(dāng)然顯而易見(jiàn),在執(zhí)行new子類操作的時(shí)候,是要先進(jìn)行其父類的構(gòu)造,即先執(zhí)行父類的構(gòu)造代碼塊(代碼中只用大括號(hào)包裹的那段代碼)以及構(gòu)造函數(shù) ,然后再執(zhí)行子類的構(gòu)造代碼塊以及構(gòu)造函數(shù)。

修改一下代碼,再來(lái)看看運(yùn)行的結(jié)果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
 * Created by fei on 2017/5/31.
 */
public class SonClass extends ParentClass{
  ParentClass parentClass;
  public SonClass(){
    System.out.println("1");
  }
  public SonClass(String name){
    System.out.println("2");
    this.name = name;
    parentClass = new ParentClass("FEI");
  }
 
  public static void main(String[] args) {
    System.out.println("------ main start ------ ");
    new SonClass("fei");
    System.out.println("------ main end ------ ");
  }
}
 
class ParentClass{
  String name ;
  public ParentClass(){
    System.out.println("3");
  }
  public ParentClass(String name){
    System.out.println("4");
    this.name = name ;
  }
}

運(yùn)行的順序是:

?
1
2
3
4
5
------ main start ------
3
2
4
------ main end ------

第一個(gè)規(guī)則:子類的構(gòu)造過(guò)程中,必須調(diào)用其父類的構(gòu)造方法。一個(gè)類,如果我們不寫構(gòu)造方法,那么編譯器會(huì)幫我們加上一個(gè)默認(rèn)的構(gòu)造方法(就是沒(méi)有參數(shù)的構(gòu)造方法),但是如果你自己寫了構(gòu)造方法,那么編譯器就不會(huì)給你添加了,所以有時(shí)候當(dāng)你new一個(gè)子類對(duì)象的時(shí)候,肯定調(diào)用了子類的構(gòu)造方法,但是如果在子類構(gòu)造方法中我們并沒(méi)有顯示的調(diào)用基類的構(gòu)造方法,如:super(); 這樣就會(huì)調(diào)用父類沒(méi)有參數(shù)的構(gòu)造方法。

第二個(gè)規(guī)則:如果子類的構(gòu)造方法中既沒(méi)有顯示的調(diào)用基類構(gòu)造方法,而基類中又沒(méi)有無(wú)參的構(gòu)造方法,則編譯出錯(cuò),所以,通常我們需要顯示的:super(參數(shù)列表),來(lái)調(diào)用父類有參數(shù)的構(gòu)造函數(shù),此時(shí)無(wú)參的構(gòu)造函數(shù)就不會(huì)被調(diào)用。

總之,一句話:子類沒(méi)有顯示調(diào)用父類構(gòu)造函數(shù),不管子類構(gòu)造函數(shù)是否帶參數(shù)都默認(rèn)調(diào)用父類無(wú)參的構(gòu)造函數(shù),若父類沒(méi)有則編譯出錯(cuò)。

還是兩個(gè)類,我們?cè)俑囊幌隆?/p>

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
 * Created by fei on 2017/5/31.
 */
public class SonClass extends ParentClass{
  private String name = "SonClass";
 
  public SonClass() {
    printName();
  }
  public void printName() {
    System.out.println("SonClass print name: " + name);
  }
  public static void main(String[] args){
    new SonClass();
  }
}
 
class ParentClass{
  private String name = "ParentClass";
 
  public ParentClass() {
    //System.out.println(this.getClass());
    printName();
  }
  public void printName() {
    System.out.println("ParentClass print name: " + name);
  }
}

看了上面的兩個(gè)例子,最后這個(gè)例子就很容易被迷惑,可能有人會(huì)覺(jué)得運(yùn)行結(jié)果是類似這樣的:

?
1
2
ParentClass print name: ParentClass
SonClass print name: SonClass

或者是:

?
1
2
ParentClass print name: SonClass
SonClass print name: SonClass

但真正的結(jié)果是這樣的:

?
1
2
SonClass print name: null
SonClass print name: SonClass

為什么會(huì)這樣,其實(shí)只要打開(kāi)代碼中父類構(gòu)造器中的這句注釋,就很容易理解了:System.out.println(this.getClass())
結(jié)果是:

?
1
class SonClass

沒(méi)錯(cuò),父類中的this引用是子類實(shí)例對(duì)象,所以在父類構(gòu)造函數(shù)里調(diào)用的還是子類的printName()方法。具體原因也并我能十分肯定,我個(gè)人淺見(jiàn),是因?yàn)殡m然我們調(diào)用了父類的構(gòu)造方法,但是我們并沒(méi)有實(shí)例化出父類的實(shí)例對(duì)象,所以this還是指向的是子類的引用。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

原文鏈接:http://blog.csdn.net/zhangjunfei12103323/article/details/72821071

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美视频首页 | 黄色一级毛片免费看 | 久久九九热re6这里有精品 | 毛片在线播放视频 | 黄色大片在线观看 | 国产午夜精品在线 | 精品一区二区三区毛片 | 国产精品99久久久久久久 | 99re热精品视频 | 香蕉视频99 | 久久久久av69精品 | 欧美成a人片在线观看久 | 亚洲成人第一区 | 91黄瓜视频| 中文在线观看视频 | 成码无人av片在线观看网站 | 国产精品成人一区二区三区电影毛片 | 成人在线精品视频 | 成人一级视频在线观看 | 精品中文字幕久久久久四十五十骆 | 成人精品久久久 | 午夜精品久久久久久久久久久久久蜜桃 | 亚州欧美视频 | 亚洲亚色 | 777sesese | 成人国产精品一区 | 日日噜噜夜夜爽 | a免费看 | 黄色特级一级片 | 在线观看国产日韩 | 欧美黄色大片免费观看 | av免费大全 | 日本一道aⅴ不卡免费播放 日日草夜夜操 | 福利片在线看 | 斗罗破苍穹在线观看免费完整观看 | 伊人午夜视频 | 欧美成人免费小视频 | 国产日产精品一区四区介绍 | 亚洲综合无码一区二区 | 色域tv| 91嫩草丨国产丨精品入口 |