在本文中,我們將通過(guò)示例了解Java中的this關(guān)鍵字,如何以及在何處使用它們。
在Java中,this關(guān)鍵字用于引用方法或構(gòu)造函數(shù)中的當(dāng)前對(duì)象。例如,
class Main {
int instVar;
Main(int instVar){
this.instVar = instVar;
System.out.println("this引用= " + this);
}
public static void main(String[] args) {
Main obj = new Main(8);
System.out.println("對(duì)象引用= " + obj);
}
}輸出:
this引用= com.ThisAndThat.MyClass@74a14482 對(duì)象引用 = com.ThisAndThat.MyClass@74a14482
在上面的示例中,我們創(chuàng)建了Main類的一個(gè)名為obj的對(duì)象。然后,我們打印對(duì)類的對(duì)象obj和this關(guān)鍵字的引用。
在這里,我們可以看到obj和this的引用是相同的。這意味著這只是對(duì)當(dāng)前對(duì)象的引用。
在各種情況下,通常都使用this關(guān)鍵字。
在Java中,不允許在范圍(類范圍或方法范圍)內(nèi)聲明兩個(gè)或多個(gè)具有相同名稱的變量。但是,實(shí)例變量和參數(shù)可能具有相同的名稱。例如,
class MyClass {
// 實(shí)例變量
int age;
// 參數(shù)
MyClass(int age){
age = age;
}
}在上面的程序中,實(shí)例變量和參數(shù)具有相同的名稱:age。在這里,由于名稱不明確,Java編譯器感到困惑。
在這種情況下,我們使用this關(guān)鍵字。例如,
首先,讓我們看一個(gè)不使用this關(guān)鍵字的示例:
class Main {
int age;
Main(int age){
age = age;
}
public static void main(String[] args) {
Main obj = new Main(8);
System.out.println("obj.age = " + obj.age);
}
}輸出:
mc.age = 0
在上面的示例中,我們已將一個(gè)值8傳遞給了構(gòu)造函數(shù)。但是,我們得到的0是輸出。這是因?yàn)镴ava編譯器由于實(shí)例變量和參數(shù)之間的名稱不明確而感到困惑。
現(xiàn)在,讓我們使用this關(guān)鍵字重寫上面的代碼。
class Main {
int age;
Main(int age){
this.age = age;
}
public static void main(String[] args) {
Main obj = new Main(8);
System.out.println("obj.age = " + obj.age);
}
}輸出:
obj.age = 8
現(xiàn)在,我們得到了預(yù)期的輸出。這是因?yàn)楫?dāng)構(gòu)造函數(shù)被調(diào)用時(shí),構(gòu)造函數(shù)內(nèi)部的內(nèi)容被調(diào)用構(gòu)造函數(shù)的對(duì)象obj所替換。因此,age變量被賦值為8。
另外,如果參數(shù)和實(shí)例變量的名稱不同,則編譯器會(huì)自動(dòng)附加this關(guān)鍵字。例如代碼:
class Main {
int age;
Main(int i) {
age = i;
}
}等同于:
class Main {
int age;
Main(int i) {
this.age = i;
}
}this關(guān)鍵字的另一個(gè)常見用法是在類的setter和getter方法中。例如:
class Main {
String name;
// setter 方法
void setName( String name ) {
this.name = name;
}
// getter 方法
String getName(){
return this.name;
}
public static void main( String[] args ) {
Main obj = new Main();
// 調(diào)用setter和getter方法
obj.setName("Seagull");
System.out.println("obj.name: "+obj.getName());
}
}輸出:
obj.name: Seagull
在這里,我們使用了this關(guān)鍵字:
在setter方法中分配值
在getter方法中訪問(wèn)值
在處理構(gòu)造函數(shù)重載時(shí),我們可能必須從另一個(gè)構(gòu)造函數(shù)調(diào)用一個(gè)構(gòu)造函數(shù)。在這種情況下,我們不能顯式調(diào)用構(gòu)造函數(shù)。相反,我們必須使用this關(guān)鍵字。
在這里,我們使用this關(guān)鍵字的另一種形式。也就是this()。讓我們舉個(gè)實(shí)例
class Complex {
private int a, b;
//帶兩個(gè)參數(shù)的構(gòu)造函數(shù)
private Complex( int i, int j ){
this.a = i;
this.b = j;
}
//具有單個(gè)參數(shù)的構(gòu)造函數(shù)
private Complex(int i){
//用兩個(gè)參數(shù)調(diào)用構(gòu)造函數(shù)
this(i, i);
}
//沒有參數(shù)的構(gòu)造函數(shù)
private Complex(){
//用單個(gè)參數(shù)調(diào)用構(gòu)造函數(shù)
this(0);
}
@Override
public String toString(){
return this.a + " + " + this.b + "i";
}
public static void main( String[] args ) {
//創(chuàng)建Complex類的對(duì)象
//使用2個(gè)參數(shù)調(diào)用構(gòu)造函數(shù)
Complex c1 = new Complex(2, 3);
//使用單個(gè)參數(shù)調(diào)用構(gòu)造函數(shù)
Complex c2 = new Complex(3);
//不帶參數(shù)調(diào)用構(gòu)造函數(shù)
Complex c3 = new Complex();
//打印對(duì)象
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
}
}輸出:
2 + 3i 3 + 3i 0 + 0i
在上面的示例中,我們使用了this關(guān)鍵字,
從構(gòu)造函數(shù)Complex(inti)調(diào)用構(gòu)造函數(shù)Complex(inti,intj)
從構(gòu)造函數(shù)Complex()調(diào)用構(gòu)造函數(shù)Complex(int i)
注意這一行,
System.out.println(c1);
在這里,當(dāng)我們打印對(duì)象c1時(shí),對(duì)象被轉(zhuǎn)換成字符串。在此過(guò)程中,將調(diào)用toString()。由于我們?cè)陬愔兄貙懥藅oString()方法,因此我們根據(jù)該方法獲得輸出。
this()的最大優(yōu)點(diǎn)之一是減少了重復(fù)代碼的數(shù)量。但是,在使用this()時(shí),我們應(yīng)該特別小心。
這是因?yàn)閺牧硪粋€(gè)構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)會(huì)增加開銷,而且這是一個(gè)緩慢的過(guò)程。使用this()的另一個(gè)巨大優(yōu)勢(shì)是減少重復(fù)代碼的數(shù)量。
注意:從另一個(gè)構(gòu)造函數(shù)調(diào)用一個(gè)構(gòu)造函數(shù)稱為顯式構(gòu)造函數(shù)調(diào)用。
我們可以使用this關(guān)鍵字將當(dāng)前對(duì)象作為參數(shù)傳遞給方法。例如,
class ThisExample {
// declare variables
int x;
int y;
ThisExample(int x, int y) {
//為構(gòu)造函數(shù)內(nèi)的變量賦值
this.x = x;
this.y = y;
//調(diào)用add()前x和y的值
System.out.println("在將this其傳遞給addTwo()方法之前:");
System.out.println("x = " + this.x + ", y = " + this.y);
//調(diào)用add()方法,將this其作為參數(shù)傳遞
add(this);
//調(diào)用add()后x和y的值
System.out.println("在將this其傳遞給addTwo()方法之后:");
System.out.println("x = " + this.x + ", y = " + this.y);
}
void add(ThisExample o){
o.x += 2;
o.y += 2;
}
}
class Main {
public static void main( String[] args ) {
ThisExample obj = new ThisExample(1, -2);
}
}輸出:
在將this其傳遞給addTwo()方法之前: x = 1, y = -2 在將this其傳遞給addTwo()方法之后: x = 3, y = 0
在上面的示例中,在構(gòu)造函數(shù)ThisExample()中,注意下面的一行,
add(this);
在這里,我們通過(guò)將this作為參數(shù)傳遞來(lái)調(diào)用add()方法。因?yàn)閠his關(guān)鍵字包含對(duì)類的對(duì)象obj的引用,所以我們可以在add()方法中更改x和y的值。