欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java this()和super()的使用注意

 更新時(shí)間:2017年04月08日 14:38:57   投稿:lqh  
這篇文章主要介紹了Java this()和super()的使用注意的相關(guān)資料,需要的朋友可以參考下

Java this()和super()的使用注意

使用super和this應(yīng)該注意這些:

1)調(diào)用super()必須寫(xiě)在子類(lèi)構(gòu)造方法的第一行,否則編譯不通過(guò)。每個(gè)子類(lèi)構(gòu)造方法的第一條語(yǔ)句,都是隱含地調(diào)用super(),如果父類(lèi)沒(méi)有這種形式的構(gòu)造函數(shù),那么在編譯的時(shí)候就會(huì)報(bào)錯(cuò)。

2)super()和this()類(lèi)似,區(qū)別是,super從子類(lèi)中調(diào)用父類(lèi)的構(gòu)造方法,this()在同一類(lèi)內(nèi)調(diào)用其它方法。

3)super()和this()均需放在構(gòu)造方法內(nèi)第一行。

4)盡管可以用this調(diào)用一個(gè)構(gòu)造器,但卻不能調(diào)用兩個(gè)。

5)this和super不能同時(shí)出現(xiàn)在一個(gè)構(gòu)造函數(shù)里面,因?yàn)閠his必然會(huì)調(diào)用其它的構(gòu)造函數(shù),其它的構(gòu)造函數(shù)必然也會(huì)有super語(yǔ)句的存在,所以在同一個(gè)構(gòu)造函數(shù)里面有相同的語(yǔ)句,就失去了語(yǔ)句的意義,編譯器也不會(huì)通過(guò)。

6)this()和super()都指的是對(duì)象,所以,均不可以在static環(huán)境中使用。包括:static變量,static方法,static語(yǔ)句塊。

7)從本質(zhì)上講,this是一個(gè)指向本對(duì)象的指針, 然而super是一個(gè)Java關(guān)鍵字。

為什么this或者super要放到第一行?

this() super()是你如果想用傳入當(dāng)前構(gòu)造器中的參數(shù)或者構(gòu)造器中的數(shù)據(jù)調(diào)用其他構(gòu)造器或者控制父類(lèi)構(gòu)造器時(shí)使用的,在一個(gè)構(gòu)造器中你只能使用this()或者super()之中的一個(gè),而且調(diào)用的位置只能在構(gòu)造器的第一行,在子類(lèi)中如果你希望調(diào)用父類(lèi)的構(gòu)造器來(lái)初始化父類(lèi)的部分,那就用合適的參數(shù)來(lái)調(diào)用super(),如果你用沒(méi)有參數(shù)的super()來(lái)調(diào)用父類(lèi)的構(gòu)造器(同時(shí)也沒(méi)有使用this()來(lái)調(diào)用其他構(gòu)造器),父類(lèi)缺省的構(gòu)造器會(huì)被調(diào)用,如果父類(lèi)沒(méi)有缺省的構(gòu)造器,那編譯器就會(huì)報(bào)一個(gè)錯(cuò)誤。
如下:

class A{ 
  public A(String name) 
  { 
    System.out.println(name); 
  } 
} 
 
class B extends A{ 
 
  public B(String name) { 
    super(name); 
  } 
   
} 

class A中沒(méi)有構(gòu)造無(wú)參的構(gòu)造函數(shù),如果在class B中的構(gòu)造函數(shù)如果沒(méi)有調(diào)用super(name)將會(huì)報(bào)錯(cuò)。

假如我們?cè)试S把this 和super放置到任何位置。那么請(qǐng)看下面代碼:

class A{   
  A()   
  {     
    System.out.println("You call super class non-args constructor!");  
  } 
} 
 
 
 class B extends A 
 {    
  B()    
  {   
    //這里,編譯器將自動(dòng)加上 super();        
    System.out.println("You call subclass constructor!");    
  }          
  B(String n)     
  {         
    super();         
    this();//ERROR:編譯錯(cuò)誤 
    //實(shí)際就是調(diào)用了B(){...},而在B(){...}中編譯器自動(dòng)加上了super();這樣就相當(dāng)于兩次調(diào)用了super();也就是說(shuō)對(duì)父類(lèi)進(jìn)行了兩次初始化。而在實(shí)例化一個(gè)對(duì)象時(shí),一個(gè)構(gòu)造方法只能調(diào)用一次,這說(shuō)明this和super不能同時(shí)存在一個(gè)構(gòu)造方法中。同時(shí)因?yàn)橄到y(tǒng)沒(méi)有在第一行發(fā)現(xiàn)this()或super()調(diào)用,就會(huì)自動(dòng)加上super(),如果沒(méi)有將this()和super()放在第一行就會(huì)產(chǎn)生矛盾。因?yàn)榭傆幸粋€(gè)super()在第二句上。所以該程序不能通過(guò)編譯?。?!  
  } 
 } 

也就是說(shuō)你必須在構(gòu)造器的第一行放置super或者this構(gòu)造器,否則編譯器會(huì)自動(dòng)地放一個(gè)空參數(shù)的super構(gòu)造器的,其他的構(gòu)造器也可以調(diào)用super或者this,調(diào)用成一個(gè)遞歸構(gòu)造鏈,最后的結(jié)果是父類(lèi)的構(gòu)造器(可能有多級(jí)父類(lèi)構(gòu)造器)始終在子類(lèi)的構(gòu)造器之前執(zhí)行,遞歸的調(diào)用父類(lèi)構(gòu)造器。無(wú)法執(zhí)行當(dāng)前的類(lèi)的構(gòu)造器。也就不能實(shí)例化任何對(duì)象,這個(gè)類(lèi)就成為一個(gè)無(wú)為類(lèi)。 

從另外一面說(shuō),子類(lèi)是從父類(lèi)繼承而來(lái),繼承了父類(lèi)的屬性和方法,如果在子類(lèi)中先不完成父類(lèi)的成員的初始化,則子類(lèi)無(wú)法使用,應(yīng)為在java中不允許調(diào)用沒(méi)初始化的成員。在構(gòu)造器中是順序執(zhí)行的,也就是說(shuō)必須在第一行進(jìn)行父類(lèi)的初始化。而super能直接完成這個(gè)功能。This()通過(guò)調(diào)用本類(lèi)中的其他構(gòu)造器也能完成這個(gè)功能。

因此,this()或者super()必須放在第一行。

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

相關(guān)文章

  • 關(guān)于JAVA11中圖片與BASE64相互轉(zhuǎn)換的實(shí)現(xiàn)

    關(guān)于JAVA11中圖片與BASE64相互轉(zhuǎn)換的實(shí)現(xiàn)

    這篇文章主要介紹了關(guān)于JAVA11中圖片與BASE64相互轉(zhuǎn)換的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • SpringBoot使用flyway初始化數(shù)據(jù)庫(kù)

    SpringBoot使用flyway初始化數(shù)據(jù)庫(kù)

    這篇文章主要介紹了SpringBoot如何使用flyway初始化數(shù)據(jù)庫(kù),幫助大家更好的理解和學(xué)習(xí)使用SpringBoot框架,感興趣的朋友可以了解下
    2021-03-03
  • Java寫(xiě)出生肖年判斷

    Java寫(xiě)出生肖年判斷

    本篇文章主要給大家分享一篇關(guān)于用JAVA寫(xiě)出生肖判斷的小功能,有興趣的跟著學(xué)習(xí)下。
    2018-02-02
  • 一文詳解如何在SpringMVC的視圖中渲染模型數(shù)據(jù)

    一文詳解如何在SpringMVC的視圖中渲染模型數(shù)據(jù)

    SpringMVC是一個(gè)基于Spring框架的Web框架,它提供了一種方便的方式來(lái)處理 HTTP 請(qǐng)求和響應(yīng),在SpringMVC中,視圖是用來(lái)渲染模型數(shù)據(jù)的組件,它們負(fù)責(zé)將模型數(shù)據(jù)轉(zhuǎn)換為HTML、JSON、XML等格式的響應(yīng),在本文中,我們將討論如何在SpringMVC中的視圖中渲染模型數(shù)據(jù)
    2023-07-07
  • Springboot @RequestBody注解踩坑記錄

    Springboot @RequestBody注解踩坑記錄

    這篇文章主要介紹了Springboot @RequestBody注解踩坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java ConcurrentHashMap的使用示例

    Java ConcurrentHashMap的使用示例

    這篇文章主要介紹了Java ConcurrentHashMap的使用示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-04-04
  • SpringBoot+devtools實(shí)現(xiàn)熱部署的示例代碼

    SpringBoot+devtools實(shí)現(xiàn)熱部署的示例代碼

    在軟件項(xiàng)目的開(kāi)發(fā)過(guò)程中,不可避免的會(huì)經(jīng)常修改代碼,每次修改代碼,都需要手動(dòng)停止然后再啟動(dòng)服務(wù),最后驗(yàn)證代碼的正確性,今天通過(guò)這篇文章,我們一起來(lái)學(xué)習(xí)一下如何使用Spring?Boot?+?devtools?輕松搞定熱部署,需要的朋友可以參考下
    2024-08-08
  • SpringBoot+Mybatis實(shí)現(xiàn)登錄注冊(cè)的示例代碼

    SpringBoot+Mybatis實(shí)現(xiàn)登錄注冊(cè)的示例代碼

    這篇文章主要介紹了SpringBoot+Mybatis實(shí)現(xiàn)登錄注冊(cè)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • java的各種集合為什么不安全(List、Set、Map)以及代替方案

    java的各種集合為什么不安全(List、Set、Map)以及代替方案

    這篇文章主要介紹了java的各種集合為什么不安全(List、Set、Map)以及代替方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • java連接Access數(shù)據(jù)庫(kù)的方法

    java連接Access數(shù)據(jù)庫(kù)的方法

    這篇文章主要為大家詳細(xì)介紹了java連接Access數(shù)據(jù)庫(kù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05

最新評(píng)論