日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java中this()和super()的注意点

發(fā)布時間:2024/4/11 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中this()和super()的注意点 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
歡迎支持筆者新作:《深入理解Kafka:核心設(shè)計與實踐原理》和《RabbitMQ實戰(zhàn)指南》,同時歡迎關(guān)注筆者的微信公眾號:朱小廝的博客。

?

歡迎跳轉(zhuǎn)到本文原文閱讀:https://honeypps.com/java/java-lime-light-of-this-and-super/

?

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

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

?

2)super()和this()類似,區(qū)別是,super從子類中調(diào)用父類的構(gòu)造方法,this()在同一類內(nèi)調(diào)用其它方法。
3)super()和this()均需放在構(gòu)造方法內(nèi)第一行。
4)盡管可以用this調(diào)用一個構(gòu)造器,但卻不能調(diào)用兩個。
5)this和super不能同時出現(xiàn)在一個構(gòu)造函數(shù)里面,因為this必然會調(diào)用其它的構(gòu)造函數(shù),其它的構(gòu)造函數(shù)必然也會有super語句的存在,所以在同一個構(gòu)造函數(shù)里面有相同的語句,就失去了語句的意義,編譯器也不會通過。
6)this()和super()都指的是對象,所以,均不可以在static環(huán)境中使用。包括:static變量,static方法,static語句塊。

?

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

?

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

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

如下:

?

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

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

?

假如我們允許把this 和super放置到任何位置。那么請看下面代碼:

?

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

?

?

?

?

?

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

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

?

歡迎跳轉(zhuǎn)到本文原文閱讀:https://honeypps.com/java/java-lime-light-of-this-and-super/

歡迎支持筆者新作:《深入理解Kafka:核心設(shè)計與實踐原理》和《RabbitMQ實戰(zhàn)指南》,同時歡迎關(guān)注筆者的微信公眾號:朱小廝的博客。

總結(jié)

以上是生活随笔為你收集整理的Java中this()和super()的注意点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。