sponsored links

面試官:this和super有什麼區別?this能呼叫到父類嗎?

面試官:this和super有什麼區別?this能呼叫到父類嗎?

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

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

1.super 關鍵字

super 是用來訪問父類例項屬性和方法的。

1.1 super 方法使用

每個例項類如果沒有顯示的指定構造方法,那麼它會生成一個隱藏的無參構造方法。對於 super() 方法也是類似,如果沒有顯示指定 super() 方法,那麼子類會生成一個隱藏的 super() 方法,用來呼叫父類的無參構造方法,這就是咱們開篇所說的“每個類在例項化的時候之所以能呼叫到 Object 類,就是預設 super 方法起作用了”,接下來我們透過例項來驗證一下這個說法。

PS:所謂的“顯示”,是指在程式中主動的呼叫,也就是在程式中新增相應的執行程式碼。

public class SuperExample {
    // 測試方法
    public static void main(String[] args) {
        Son son = new Son();
    }
}

/**
 * 父類
 */
class Father {
    public Father() {
        System.out.println("執行父類的構造方法");
    }
}

/**
 * 子類
 */
class Son extends Father {
}

在以上程式碼中,子類 Son 並沒有顯示指定 super() 方法,我們執行以上程式,執行的結果如下:

面試官:this和super有什麼區別?this能呼叫到父類嗎?

從上述的列印結果可以看出,子類 Son 在沒有顯示指定 super() 方法的情況下,竟然呼叫了父類的無參構造方法,這樣從側面驗證了,如果子類沒有顯示指定 super() 方法,那麼它也會生成一個隱藏的 super() 方法。這一點我們也可以從此類生成的位元組碼檔案中得到證實,如下圖所示:

面試官:this和super有什麼區別?this能呼叫到父類嗎?

super 方法注意事項

如果顯示使用 super() 方法,那麼 super() 方法必須放在構造方法的首行,否則編譯器會報錯,如下程式碼所示:

面試官:this和super有什麼區別?this能呼叫到父類嗎?

如上圖看到的那樣,如果 super() 方法沒有放在首行,那麼編譯器就會報錯:提示 super() 方法必須放到構造方法的首行。

為什麼要把 super() 方法放在首行呢?

這是因為,只要將 super() 方法放在首行,那麼在例項化子類時才能確保父類已經被先初始化了。

1.2 super 屬性使用

使用 super 還可以呼叫父類的屬性,比如以下程式碼可以透過子類 Son 呼叫父類中的 age 屬性,實現程式碼如下:

public class SuperExample {
    // 測試方法
    public static void main(String[] args) {
        Son son = new Son();
    }
}

/**
 * 父類
 */
class Father {
    // 定義一個 age 屬性
    public int age = 30;

    public Father() {
        super();
        System.out.println("執行父類的構造方法");
    }
}

/**
 * 子類
 */
class Son extends Father {
    public Son() {
        System.out.println("父類 age:" + super.age);
    }
}

以上程式的執行結果如下圖所示,在子類中成功地獲取到了父類中的 age 屬性:

面試官:this和super有什麼區別?this能呼叫到父類嗎?

2.this 關鍵字

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

2.1 this 屬性使用

this 最常見的用法是用來賦值本類屬性的,比如常見的 setter 方法,如下程式碼所示:

面試官:this和super有什麼區別?this能呼叫到父類嗎?

上述程式碼中 this.name 表示 Person 類的 name 屬性,此處的 this 關鍵字不能省略,如果省略就相當於給當前的區域性變數 name 賦值 name,自己給自己賦值了。我們可以嘗試一下,將 this 關鍵字取消掉,實現程式碼如下:

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());
    }
}

以上程式的執行結果如下圖所示:

面試官:this和super有什麼區別?this能呼叫到父類嗎?

從上述結果可以看出,將 this 關鍵字去掉之後,賦值失敗,Person 物件中的 name 屬性就為 null 了。

2.2 this 方法使用

我們可以使用 this() 方法來呼叫本類中的構造方法,具體實現程式碼如下:

public class ThisExample {
    // 測試方法
    public static void main(String[] args) {
        Son p = new Son("Java");
    }
}

/**
 * 父類
 */
class Father {
    public Father() {
        System.out.println("執行父類的構造方法");
    }
}

/**
 * 子類
 */
class Son extends Father {
    public Son() {
        System.out.println("子類中的無參構造方法");
    }
    public Son(String name) {
        // 使用 this 呼叫本類中無參的構造方法
        this();
        System.out.println("子類有參構造方法,name:" + name);
    }
}

以上程式的執行結果如下圖所示:

面試官:this和super有什麼區別?this能呼叫到父類嗎?

從上述結果中可以看出,透過 this() 方法成功呼叫到了本類中的無參構造方法。

注意:this() 方法和 super() 方法的使用規則一樣,如果顯示的呼叫,只能放在方法的首行。

2.3 this 訪問父類方法

接下來,我們嘗試使用 this 訪問父類方法,具體實現程式碼如下:

public class ThisExample {
    public static void main(String[] args) {
        Son son = new Son();
        son.sm();
    }
}

/**
 * 父類
 */
class Father {
    public void fm() {
        System.out.println("呼叫了父類中的 fm() 方法");
    }
}

/**
 * 子類
 */
class Son extends Father {
    public void sm() {
        System.out.println("呼叫子類的 sm() 方法訪問父類方法");
        // 呼叫父類中的方法
        this.fm();
    }
}

以上程式的執行結果如下:

面試官:this和super有什麼區別?this能呼叫到父類嗎?

從上述結果可以看出,使用 this 是可以訪問到父類中的方法的,this 會先從本類中找,如果找不到則會去父類中找。

3.this 和 super 的區別

① 指代的物件不同

super 指代的是父類,是用來訪問父類的;而 this 指代的是當前類。

② 查詢範圍不同

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

③ 本類屬性賦值不同

this 可以用來為本類的例項屬性賦值,而 super 則不能實現此功能。

④ this 可用於 synchronized

因為 this 表示當前物件,所以this 可用於 synchronized(this){....} 加鎖,而 super 則不能實現此功能。

總結

this 和 super 都是 Java 中的關鍵字,都起指代作用,當顯示使用它們時,都需要將它們放在方法的首行(否則編譯器會報錯)。this 表示當前物件,super 用來指代父類物件,它們有四點不同:指代物件、查詢訪問、本類屬性賦值和 synchronized 的使用不同。

是非審之於己,譭譽聽之於人,得失安之於數。

公眾號:Java面試真題解析

分類: 農業
時間: 2021-12-26

相關文章

蘇州方案“出爐”!中國農科院聯合蘇州釋出2.0版農業農村現代化評價考核指標體系

蘇州方案“出爐”!中國農科院聯合蘇州釋出2.0版農業農村現代化評價考核指標體系
農業強.農民富.農村美.社會文明程度高--9月18日,中國農業科學院和蘇州市人民政府聯合釋出<蘇州市率先基本實現農業農村現代化評價考核指標體系(2020-2022年)(試行)(2.0版)> ...

把解決好“三農”問題作為重中之重
來源:人民網-人民日報 金黃稻穀千層浪,累累瓜果十里香.農民豐收節裡話豐收,安徽省鳳陽縣小崗村種糧大戶程夕兵滿是感慨:"咱農民趕上好時代,感恩總書記,感恩共產黨!" 程夕兵至今念念 ...

糧食大事 託市收購穩種糧信心
目前,我國糧食收購已經形成了以市場化收購為主導.政策性收購為補充的新格局,糧價形成逐步迴歸市場化,優質優價的糧食收儲機制逐步形成.一定要堅持市場化改革和保護農民利益並重的原則,堅持並完善稻穀和小麥最低 ...

甘肅省文旅廳全面啟動鄉村旅遊示範縣、文旅振興鄉村樣板村建立工作

甘肅省文旅廳全面啟動鄉村旅遊示範縣、文旅振興鄉村樣板村建立工作
宕昌縣鹿仁村. 今年,省文旅廳大力實施文旅鞏固脫貧攻堅成果.助力鄉村振興戰略,圍繞打造"文化興.生態美.百姓富"的文化旅遊強省目標,把建立鄉村旅遊示範縣.文旅振興鄉村樣板村作為鞏固 ...

黨史百年天天讀29 | 學習百年黨史 汲取奮進力量

黨史百年天天讀29 | 學習百年黨史 汲取奮進力量
重 要 論 述 1936年4月25日 中共中央釋出<為創立全國各黨各派的抗日人民陣線宣言>,首次公開把國民黨列為抗日民族統一戰線的物件.宣言表示:在全中國亡國滅種的緊急關頭,中國共產黨中央 ...

農業:農村找不到年輕農民,美麗鄉村建設的重擔誰來挑
農民被稱作"土包子",農村人被稱作"鄉巴佬",農業產品都"不值錢",難怪出現許多自己本身是農民,又不願意承認是農民,更不想當農民的農民朋友了 ...

山西:3000餘名農業幹部專家為災區農民紓危解困
來源:人民網 人民網太原10月12日電(雷昊)10月2日至7日連續強降水過程,疊加入秋以來幾次強降水,造成山西省76個縣在田作物受災.畜禽圈舍倒塌.農田及設施毀損,秋收秋種秋耕推遲,對"三秋 ...

農村“綠富美”如何造就?美麗鄉村為農民而建
來源:經濟日報-中國經濟網 中國要美,農村必須美:中國要富,農民必須富.隨著農村生態文明建設取得明顯成效,眾多鄉村奔向"綠富美",一幅生態宜居的美麗畫卷正在廣袤鄉土鋪展開來. 告別 ...

農村承包地宅基地有償退出要具備三個條件,農民朋友快來了解

農村承包地宅基地有償退出要具備三個條件,農民朋友快來了解
農村承包地和宅基地有償退出從2015年就開始試點工作,當時試點有33個縣,經過5年的試點實踐,已經為第二輪更大範圍內試點積累和總結了一定的經驗. 2020年9月,在原有33個試點縣基礎上,又在全國範圍 ...

溫鐵軍:農村現在很多年輕人外出打工,未來田地誰來種?

溫鐵軍:農村現在很多年輕人外出打工,未來田地誰來種?
隨著中國不斷的發展,人們不得不承認一個問題就是農村的人口一直在流失.農村人口的流失從農村留守兒童數量每年都在增加被側面反應出來,大部分的農村勞動力在出門打工和在家務農這兩者之間選擇了後者. 我們都知道 ...

中秋閤家團聚的日子,農民都在忙什麼?4件事,哪一件都不敢耽誤

中秋閤家團聚的日子,農民都在忙什麼?4件事,哪一件都不敢耽誤
再過兩天,就是中華民族傳統節日中秋節.這是一個閤家團圓的節日,海上生明月,天涯共此時.不管你身處何方,抬頭看見天上的一輪明月,就能想起遠方的親友,舉杯相邀,吃月餅,話家常,享受秋天的喜悅. 在農村中, ...

新型職業農民要從培訓轉向培育

新型職業農民要從培訓轉向培育
[專家視角] 作者:肖前玲(四川外國語大學國際教育學院講師) 編者按 鄉村振興,關鍵在人.努力培育一大批"愛農業.懂技術.善經營"的新型職業農民既是鄉村人才振興的核心要義,也是農業 ...

2021年度“全國十佳農民”揭曉
來源:中國日報網 中國日報9月23日電(記者 趙伊夢)9月23日,2021年度"全國十佳農民"在浙江省嘉興市"中國農民豐收節"活動主會場揭曉.王佔傑.王穎.尤良 ...

秋收秋種困難 農業農村部下發通知
農業農村部:要求各地積極應對連陰雨不誤農時抓好搶收搶種 9月以來,西南北部.西北東部.華北.黃淮北部.東北南部出現多輪降雨天氣過程,部分地區雨量突破歷史極值,造成土壤水分飽和,區域性農田積水,給秋收秋 ...

同是人口農業大國,為何中國滿世界買糧,印度卻成糧食出口大國?

同是人口農業大國,為何中國滿世界買糧,印度卻成糧食出口大國?
中國常被拿來與印度做比較,同樣多的人口和耕地,同樣悠久的農耕文明,然而兩國在糧食方面的情況卻有些不一樣. 疫情前後,中國不斷進口糧食,印度卻不斷加大糧食出口,甚至在2021年上半年,印度已經成為世界第 ...

振興農村集體經濟組織,為鄉村全面振興奠定堅實基礎
從上世紀60年代初期確定了農村的經營制度以來至今,農村基本上是按照"三級所有.隊為基礎"的經營制度在執行,雖然在後來的八十年代初期用"家庭聯產承包經營"為主,調 ...

中國農業:小農戶還是大農場?

中國農業:小農戶還是大農場?
中國農業:小農戶還是大農場? 蔣高明 幾年前,美國農業與貿易政策研究所(IATP)所長Harkness博士到筆者辦公室,我們聊起了美國與中國農業政策.食品安全等問題,至今印象很深.有些問題至今仍然有現 ...

過去農村田地裡的馬泡瓜,為什麼被叫成馬寶?現在為什麼不多了?

過去農村田地裡的馬泡瓜,為什麼被叫成馬寶?現在為什麼不多了?
農村八零後們對馬泡瓜並不陌生,因為以前的田地裡到處都是.而且這東西有個神奇之處,由於各地方言的不同,對一些雜草什麼的會出現叫法不同,但馬泡瓜在大多數地方都叫這個名字. 當然了,也是有稍許區別的,比如我 ...

四川完成農村廁所革命專項清查
原標題:四川完成農村廁所革命專項清查 目前,我省已完成農村廁所革命專項清查,並加速整改.這是記者近日從省農業農村廳獲悉的. 2018年,作為鄉村振興"第一仗",我省全面啟動人居環境 ...

馬雲說“致富未來在農村”,那未來哪些人可以成為農村的致富人?

馬雲說“致富未來在農村”,那未來哪些人可以成為農村的致富人?
#三農高質量創作大賽#農村是一片廣闊的天地,滋養著數億人的生活,也曾是許多城市人仰望的地方.但在包產到戶之後,隨著時代的發展與城鎮化建設的需要,不少的農民走出農村,踏上了外出務工的征程,使農村從事農業 ...