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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面试官:this和super有什么区别?this能调用到父类吗?

發(fā)布時(shí)間:2025/3/11 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试官:this和super有什么区别?this能调用到父类吗? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者:磊哥

來源 | Java面試真題解析(ID:aimianshi666)

轉(zhuǎn)載請聯(lián)系授權(quán)(微信ID:GG_Stone)

本文已收錄《Java常見面試題》:https://gitee.com/mydb/interview

this 和 super 都是 Java 中常見的關(guān)鍵字,雖然二者在很多情況下都可以被省略,但它們在 Java 中所起的作用是不可磨滅的。它們都是用來起指代作用的,每個(gè)類在實(shí)例化的時(shí)候之所以能調(diào)用到 Object 類(Object 類是所有類的父類),全是二者的“功勞”。

1.super 關(guān)鍵字

super 是用來訪問父類實(shí)例屬性和方法的。

1.1 super 方法使用

每個(gè)實(shí)例類如果沒有顯式的指定構(gòu)造方法,那么它會生成一個(gè)隱藏的無參構(gòu)造方法。對于 super() 方法也是類似,如果沒有顯式指定 super() 方法,那么子類會生成一個(gè)隱藏的 super() 方法,用來調(diào)用父類的無參構(gòu)造方法,這就是咱們開篇所說的“每個(gè)類在實(shí)例化的時(shí)候之所以能調(diào)用到 Object 類,就是默認(rèn) super 方法起作用了”,接下來我們通過實(shí)例來驗(yàn)證一下這個(gè)說法。

PS:所謂的“顯式”,是指在程序中主動的調(diào)用,也就是在程序中添加相應(yīng)的執(zhí)行代碼。

public?class?SuperExample?{//?測試方法public?static?void?main(String[]?args)?{Son?son?=?new?Son();} }/***?父類*/ class?Father?{public?Father()?{System.out.println("執(zhí)行父類的構(gòu)造方法");} }/***?子類*/ class?Son?extends?Father?{ }

在以上代碼中,子類 Son 并沒有顯式指定 super() 方法,我們運(yùn)行以上程序,執(zhí)行的結(jié)果如下:從上述的打印結(jié)果可以看出,子類 Son 在沒有顯式指定 super() 方法的情況下,竟然調(diào)用了父類的無參構(gòu)造方法,這樣從側(cè)面驗(yàn)證了,如果子類沒有顯式指定 super() 方法,那么它也會生成一個(gè)隱藏的 super() 方法。這一點(diǎn)我們也可以從此類生成的字節(jié)碼文件中得到證實(shí),如下圖所示:

super 方法注意事項(xiàng)

如果顯式使用 super() 方法,那么 super() 方法必須放在構(gòu)造方法的首行,否則編譯器會報(bào)錯(cuò),如下代碼所示:如上圖看到的那樣,如果 super() 方法沒有放在首行,那么編譯器就會報(bào)錯(cuò):提示 super() 方法必須放到構(gòu)造方法的首行。為什么要把 super() 方法放在首行呢?這是因?yàn)?#xff0c;只要將 super() 方法放在首行,那么在實(shí)例化子類時(shí)才能確保父類已經(jīng)被先初始化了。

1.2 super 屬性使用

使用 super 還可以調(diào)用父類的屬性,比如以下代碼可以通過子類 Son 調(diào)用父類中的 age 屬性,實(shí)現(xiàn)代碼如下:

public?class?SuperExample?{//?測試方法public?static?void?main(String[]?args)?{Son?son?=?new?Son();} }/***?父類*/ class?Father?{//?定義一個(gè)?age?屬性public?int?age?=?30;public?Father()?{super();System.out.println("執(zhí)行父類的構(gòu)造方法");} }/***?子類*/ class?Son?extends?Father?{public?Son()?{System.out.println("父類?age:"?+?super.age);} }

以上程序的執(zhí)行結(jié)果如下圖所示,在子類中成功地獲取到了父類中的 age 屬性:

2.this 關(guān)鍵字

this 是用來訪問本類實(shí)例屬性和方法的,它會先從本類中找,如果本類中找不到則在父類中找。

2.1 this 屬性使用

this 最常見的用法是用來賦值本類屬性的,比如常見的 setter 方法,如下代碼所示:上述代碼中 this.name 表示 Person 類的 name 屬性,此處的 this 關(guān)鍵字不能省略,如果省略就相當(dāng)于給當(dāng)前的局部變量 name 賦值 name,自己給自己賦值了。我們可以嘗試一下,將 this 關(guān)鍵字取消掉,實(shí)現(xiàn)代碼如下:

class?Person?{private?String?name;public?void?setName(String?name)?{this.name?=?name;}public?String?getName()?{return?name;} } public?class?ThisExample?{public?static?void?main(String[]?args)?{Person?p?=?new?Person();p.setName("磊哥");System.out.println(p.getName());} }

以上程序的執(zhí)行結(jié)果如下圖所示:從上述結(jié)果可以看出,將 this 關(guān)鍵字去掉之后,賦值失敗,Person 對象中的 name 屬性就為 null 了。

2.2 this 方法使用

我們可以使用 this() 方法來調(diào)用本類中的構(gòu)造方法,具體實(shí)現(xiàn)代碼如下:

public?class?ThisExample?{//?測試方法public?static?void?main(String[]?args)?{Son?p?=?new?Son("Java");} }/***?父類*/ class?Father?{public?Father()?{System.out.println("執(zhí)行父類的構(gòu)造方法");} }/***?子類*/ class?Son?extends?Father?{public?Son()?{System.out.println("子類中的無參構(gòu)造方法");}public?Son(String?name)?{//?使用?this?調(diào)用本類中無參的構(gòu)造方法this();System.out.println("子類有參構(gòu)造方法,name:"?+?name);} }

以上程序的執(zhí)行結(jié)果如下圖所示:從上述結(jié)果中可以看出,通過 this() 方法成功調(diào)用到了本類中的無參構(gòu)造方法。

注意:this() 方法和 super() 方法的使用規(guī)則一樣,如果顯式的調(diào)用,只能放在方法的首行。

2.3 this 訪問父類方法

接下來,我們嘗試使用 this 訪問父類方法,具體實(shí)現(xiàn)代碼如下:

public?class?ThisExample?{public?static?void?main(String[]?args)?{Son?son?=?new?Son();son.sm();} }/***?父類*/ class?Father?{public?void?fm()?{System.out.println("調(diào)用了父類中的?fm()?方法");} }/***?子類*/ class?Son?extends?Father?{public?void?sm()?{System.out.println("調(diào)用子類的?sm()?方法訪問父類方法");//?調(diào)用父類中的方法this.fm();} }

以上程序的執(zhí)行結(jié)果如下:從上述結(jié)果可以看出,使用 this 是可以訪問到父類中的方法的,this 會先從本類中找,如果找不到則會去父類中找。

3.this 和 super 的區(qū)別

1.指代的對象不同

super 指代的是父類,是用來訪問父類的;而 this 指代的是當(dāng)前類。

2.查找范圍不同

super 只能查找父類,而 this 會先從本類中找,如果找不到則會去父類中找。

3.本類屬性賦值不同

this 可以用來為本類的實(shí)例屬性賦值,而 super 則不能實(shí)現(xiàn)此功能。

4.this 可用于 synchronized

因?yàn)?this 表示當(dāng)前對象,所以this 可用于 synchronized(this){....} 加鎖,而 super 則不能實(shí)現(xiàn)此功能。

總結(jié)

this 和 super 都是 Java 中的關(guān)鍵字,都起指代作用,當(dāng)顯式使用它們時(shí),都需要將它們放在方法的首行(否則編譯器會報(bào)錯(cuò))。this 表示當(dāng)前對象,super 用來指代父類對象,它們有四點(diǎn)不同:指代對象、查找訪問、本類屬性賦值和 synchronized 的使用不同。

是非審之于己,毀譽(yù)聽之于人,得失安之于數(shù)。

公眾號:Java面試真題解析

往期推薦

面試官:接口和抽象類有什么區(qū)別?


面試官:HashSet如何保證元素不重復(fù)?


面試官:如何實(shí)現(xiàn) List 集合去重?


總結(jié)

以上是生活随笔為你收集整理的面试官:this和super有什么区别?this能调用到父类吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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