天天看點

大白話說清楚 Java 中的 this 和 super 關鍵字!

今天就用最通俗易懂的大白話來聊一聊 Java 中的 this 和 super 以及 this() 和 super()。

1、this關鍵字

package com.cj.study.thissuper;

public class Student{

    public String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

}      

上述代碼是很常見的javabean的定義,裡邊經常會出現this這個關鍵字

那有思考過為什麼這裡需要用this這個關鍵字嗎?

為了更簡單的解釋這個問題,将上述的代碼改一下:

大白話說清楚 Java 中的 this 和 super 關鍵字!

把set方法裡的this.name的this去掉,變成了name=name,就會發現個問題,這2個name都是局部變量的name,這就變成了局部變量給局部變量指派了, 但是咱們是想給對象的name指派,并不是想給局部變量指派,由于名稱一樣導緻區分不出來了。

是以必須用this來區分一下;當然如果兩個不重名的話,name=nnn 這種的不加this是沒問題的,這是因為它是先在局部找變量,如果找到了就用局部變量,沒找到就去找全局變量。

那這個this到底是啥呢?

this是目前對象的引用,就是說目前用構造函數建的對象是誰,這個this就代表誰,它是一個引用

另外一個問題,如果構造函數想調用另一個構造函數該怎麼辦呢?

這個時候就需要使用this()了

大白話說清楚 Java 中的 this 和 super 關鍵字!

注意:如果在構造函數裡調用其他重載的構造函數時,則,被調用的那個構造函數必須放在代碼的第一行

下邊是示例:

正确的

大白話說清楚 Java 中的 this 和 super 關鍵字!

錯誤的

大白話說清楚 Java 中的 this 和 super 關鍵字!

2、super關鍵字

大白話說清楚 Java 中的 this 和 super 關鍵字!

上述例子是父類裡定義了一個字段是num,子類裡沒有定義,是以最後的輸出結果是showNum=4

但是如果子類也定義了一個num值為5,那列印出來的一定是5,因為在調用成員(成員變量和成員方法)時如果不特殊标明,前邊其實預設省略了this,他預設調用的是子類的

但是如果這時候我就想用父類的不想用子類的,怎麼辦

這時候又出現了區分不出來的情況,是以要用super來标明你要調用父類的,而不是子類的

大白話說清楚 Java 中的 this 和 super 關鍵字!

當隻有父類有,子類沒有的情況下,則調的是父類的(因為子類繼承了父類,子類就擁有了父類出了私有外的所有東西)

當父類和子類都有的情況下,預設調用的是子類的,但是用super标明了以後調的是父類的

大白話說清楚 Java 中的 this 和 super 關鍵字!

如上圖所示,this和super的引用是這樣指向對象的成員變量和方法。

this指向了不僅父類可繼承的成員變量和可繼承的方法外,它還指向了子類的成員變量和方法

而super僅僅隻是指向了子類對象中從父類繼承的成員變量和方法。

那如果子類 構造函數想調用父類的構造函數, 怎麼辦?

這時候可以用super();

注意: 在子類的構造函數裡都必須去調用父類的構造函數,你不寫其實第一行都有一個隐式的super();

大白話說清楚 Java 中的 this 和 super 關鍵字!

如果父類裡不定義無參的構造的話子類的構造函數會報錯,是以說明在子類的構造函數預設的都有一句隐式的super();

你的構造函數裡預設的都有一個隐式的super();去調用父類無參的構造,但是如果你的構造函數裡不想調用預設的父類無參構造,而是想調用父類其他的構造函數,則你可以顯式的寫出來,而且如果你寫了則調用父類的supper(xxx) 必須放在第一行

大白話說清楚 Java 中的 this 和 super 關鍵字!

以上就是對this和super的一些總結,希望對大家有所幫助!

大白話說清楚 Java 中的 this 和 super 關鍵字!
大白話說清楚 Java 中的 this 和 super 關鍵字!