在 CodeGym 上,學生們從第一節課開始就按字面意思向學生介紹了 Java this關鍵字。隨著時間的推移,它的含義變得清晰。但回過頭來看,估計很多人都承認自己很長一段時間都無法理解這個關鍵詞的禪意。本文將為任何尚未能夠這樣做的人揭開this關鍵字秘密的面紗......我有Schildt 的 Java 參考資料,然後在第 171 頁你可以看到this關鍵字方法需要引用調用它的對象。我們可以以此結束課程。但我們需要細節。通常,您需要在兩種情況下使用它:
所以事實證明您只是將方法的名稱變量分配給它自己。這當然沒有任何意義。因此,該語言需要某種方式來區分Human類的名稱變量和setName方法中的名稱變量。通過引入this關鍵字解決了這個問題,在這種情況下,它表示您打算引用與Human類的實例關聯的變量,而不是方法中的變量: 換句話說,this
指的是調用對象,正如我們在文章開頭提到的。結果,setName方法在創建的對像上設置了人名。下面是不使用this關鍵字的程序代碼。該代碼創建了一個Human對象並為其分配了一個名稱: 下面是帶有this
關鍵字的代碼:
- 當實例變量和方法/構造函數變量具有相同的名稱時;
- 當您需要從另一種類型的構造函數調用特定類型的構造函數(例如,默認構造函數或參數化構造函數)時。這也稱為顯式構造函數調用。
示例 1:實例變量和方法變量具有相同的名稱。
假設我們有一個定義 name 字段的Human類:讓我們為name變量創建一個 setter(setter 功能齊全——這裡沒有問題):
class Human {
String name;
public void setName(String newName) {
name = newName;
}
}
請注意,我們將String newName傳遞給setName setter 方法 我們聲明了一個新變量,並且可以隨意命名它,因為它僅在包含 setName 方法的大括號 ({}) 內可見。請注意,設置器只有一行:
name = newName;
這裡我們引入了一個名為newName的新變量,並將其分配給對象的現有名稱變量。當我們最終談論的是同一件事時,許多程序員可能會覺得引入一個新名稱的變量很奇怪。也就是說,我們正在談論Human類中的名稱字段。這就是為什麼 Java 的創造者想出了一種方法來方便地使用相同的變量名。換句話說,為什麼一個變量有兩個名稱表示同一事物。換句話說,我們想做這樣的事情:
class Human {
String name;
public void setName(String name) {
name = name;
}
}
但是這裡我們遇到了一個問題。我們現在有兩個同名的變量。一個String 名稱屬於Human類,而另一個String 名稱屬於其setName方法。因此,當您在 setter 中編寫以下行時,JVM 將不知道您指的是哪個變量:
name = name;
Java 假定您指的是最接近的名稱變量,即來自setName方法的名稱變量: 


public class Solution {
public static void main(String[] args) {
Human human1 = new Human();
human1.setName("Vinny");
human1.print();
}
}
class Human {
String name;
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
void print() {
System.out.println(name);
}
}
因此,這讓我們避免引入新變量來表示相同的事物,從而使代碼更清晰,並且不會因額外變量而混亂。
示例 2:將其用於顯式構造函數調用
當您有(奇怪的是)多個構造函數並且您不希望新構造函數複製先前在不同構造函數中編寫的初始化代碼時,從另一個構造函數調用一個構造函數可能很有用。使困惑?它並不像看起來那麼可怕。看看下面的代碼。它有兩個Human類的構造函數:
class Human {
int age;
int weight;
int height;
Human(int age, int weight) {
this.age = age;
this.weight = weight;
}
Human(int age, int weight, int height) {
// Call the constructor with two parameters
this(age, weight);
// and then initialize the missing variable
this.height = height;
}
}
在這裡,我們首先提供了一個帶有兩個參數的構造函數:int age和int weight。假設它有兩行代碼:
this.age = age;
this.weight = weight;
稍後我們決定添加另一個具有三個參數的構造函數,將身高添加到現有的年齡和體重參數中。您可以像這樣編寫新的構造函數:
this.age = age;
this.weight = weight;
this.height = height;
但是,您可以使用 this關鍵字顯式調用帶有兩個參數的構造函數,而不是在此構造函數中重複現有代碼:
this(age, weight);
// and then initialize the missing variable:
this.height = height;
就好像我們在對三參數構造函數說:
- 調用另一個具有兩個參數的構造函數
- 然後添加另一個變量。
GO TO FULL VERSION