自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:This 和Super 有什么區(qū)別?This 能調(diào)用到父類嗎?

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

[[442139]]

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

1.super 關(guān)鍵字

super 是用來(lái)訪問(wèn)父類實(shí)例屬性和方法的。

1.1 super 方法使用

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

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

  1. public class SuperExample { 
  2.     // 測(cè)試方法 
  3.     public static void main(String[] args) { 
  4.         Son son = new Son(); 
  5.     } 
  6.  
  7. /** 
  8.  * 父類 
  9.  */ 
  10. class Father { 
  11.     public Father() { 
  12.         System.out.println("執(zhí)行父類的構(gòu)造方法"); 
  13.     } 
  14.  
  15. /** 
  16.  * 子類 
  17.  */ 
  18. class Son extends Father { 

在以上代碼中,子類 Son 并沒(méi)有顯示指定 super() 方法,我們運(yùn)行以上程序,執(zhí)行的結(jié)果如下:

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

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

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

1.2 super 屬性使用

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

  1. public class SuperExample { 
  2.     // 測(cè)試方法 
  3.     public static void main(String[] args) { 
  4.         Son son = new Son(); 
  5.     } 
  6.  
  7. /** 
  8.  * 父類 
  9.  */ 
  10. class Father { 
  11.     // 定義一個(gè) age 屬性 
  12.     public int age = 30; 
  13.  
  14.     public Father() { 
  15.         super(); 
  16.         System.out.println("執(zhí)行父類的構(gòu)造方法"); 
  17.     } 
  18.  
  19. /** 
  20.  * 子類 
  21.  */ 
  22. class Son extends Father { 
  23.     public Son() { 
  24.         System.out.println("父類 age:" + super.age); 
  25.     } 

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

2.this 關(guān)鍵字

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

2.1 this 屬性使用

this 最常見(jiàn)的用法是用來(lái)賦值本類屬性的,比如常見(jiàn)的 setter 方法,如下代碼所示:

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

  1. class Person { 
  2.     private String name
  3.     public void setName(String name) { 
  4.         this.name = name
  5.     } 
  6.     public String getName() { 
  7.         return name
  8.     } 
  9. public class ThisExample { 
  10.     public static void main(String[] args) { 
  11.         Person p = new Person(); 
  12.         p.setName("磊哥"); 
  13.         System.out.println(p.getName()); 
  14.     } 

以上程序的執(zhí)行結(jié)果如下圖所示:

從上述結(jié)果可以看出,將 this 關(guān)鍵字去掉之后,賦值失敗,Person 對(duì)象中的 name 屬性就為 null 了。

2.2 this 方法使用

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

  1. public class ThisExample { 
  2.     // 測(cè)試方法 
  3.     public static void main(String[] args) { 
  4.         Son p = new Son("Java"); 
  5.     } 
  6.  
  7. /** 
  8.  * 父類 
  9.  */ 
  10. class Father { 
  11.     public Father() { 
  12.         System.out.println("執(zhí)行父類的構(gòu)造方法"); 
  13.     } 
  14.  
  15. /** 
  16.  * 子類 
  17.  */ 
  18. class Son extends Father { 
  19.     public Son() { 
  20.         System.out.println("子類中的無(wú)參構(gòu)造方法"); 
  21.     } 
  22.     public Son(String name) { 
  23.         // 使用 this 調(diào)用本類中無(wú)參的構(gòu)造方法 
  24.         this(); 
  25.         System.out.println("子類有參構(gòu)造方法,name:" + name); 
  26.     } 

以上程序的執(zhí)行結(jié)果如下圖所示:

從上述結(jié)果中可以看出,通過(guò) this() 方法成功調(diào)用到了本類中的無(wú)參構(gòu)造方法。

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

2.3 this 訪問(wèn)父類方法

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

  1. public class ThisExample { 
  2.     public static void main(String[] args) { 
  3.         Son son = new Son(); 
  4.         son.sm(); 
  5.     } 
  6.  
  7. /** 
  8.  * 父類 
  9.  */ 
  10. class Father { 
  11.     public void fm() { 
  12.         System.out.println("調(diào)用了父類中的 fm() 方法"); 
  13.     } 
  14.  
  15. /** 
  16.  * 子類 
  17.  */ 
  18. class Son extends Father { 
  19.     public void sm() { 
  20.         System.out.println("調(diào)用子類的 sm() 方法訪問(wèn)父類方法"); 
  21.         // 調(diào)用父類中的方法 
  22.         this.fm(); 
  23.     } 

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

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

1).指代的對(duì)象不同

super 指代的是父類,是用來(lái)訪問(wèn)父類的;而 this 指代的是當(dāng)前類。

2).查找范圍不同

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

3).本類屬性賦值不同

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

4).this 可用于 synchronized

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

總結(jié)

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

本文轉(zhuǎn)載自微信公眾號(hào)「Java面試真題解析」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java面試真題解析公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: Java面試真題解析
相關(guān)推薦

2021-12-23 07:11:31

開(kāi)發(fā)

2023-02-17 08:10:24

2024-04-03 15:33:04

JWTSession傳輸信息

2024-09-19 08:42:43

2023-12-13 13:31:00

useEffect對(duì)象瀏覽器

2021-11-30 07:44:50

FinalFinallyFinalize

2021-12-10 12:01:37

finalfinallyfinalize

2021-12-13 06:56:45

Comparable元素排序

2024-03-20 15:12:59

KafkaES中間件

2023-02-09 07:01:35

轉(zhuǎn)發(fā)重定向Java

2023-07-11 08:40:02

IO模型后臺(tái)

2023-02-20 07:19:14

2022-05-16 11:04:43

RocketMQPUSH 模式PULL 模式

2024-03-26 16:24:46

分布式事務(wù)2PC3PC

2025-03-12 08:45:15

函數(shù)聲明函數(shù)表達(dá)式IIFE

2021-07-08 06:51:29

React函數(shù)組件

2023-12-05 09:33:08

分布式事務(wù)

2021-05-10 08:01:12

BeanFactoryFactoryBean容器

2022-08-22 07:06:32

MyBatisSQL占位符

2025-04-09 00:00:55

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)