在本文中,我們將通過示例了解Java中的this關(guān)鍵字,如何以及在何處使用它們。
在Java中,this關(guān)鍵字用于引用方法或構(gòu)造函數(shù)中的當(dāng)前對象。例如,
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("對象引用= " + obj); } }
輸出:
this引用= com.ThisAndThat.MyClass@74a14482 對象引用 = com.ThisAndThat.MyClass@74a14482
在上面的示例中,我們創(chuàng)建了Main類的一個(gè)名為obj的對象。然后,我們打印對類的對象obj和this關(guān)鍵字的引用。
在這里,我們可以看到obj和this的引用是相同的。這意味著這只是對當(dāng)前對象的引用。
在各種情況下,通常都使用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ù)的對象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方法中訪問值
在處理構(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類的對象 //使用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(); //打印對象 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)我們打印對象c1時(shí),對象被轉(zhuǎn)換成字符串。在此過程中,將調(diào)用toString()。由于我們在類中重寫了toString()方法,因此我們根據(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è)緩慢的過程。使用this()的另一個(gè)巨大優(yōu)勢是減少重復(fù)代碼的數(shù)量。
注意:從另一個(gè)構(gòu)造函數(shù)調(diào)用一個(gè)構(gòu)造函數(shù)稱為顯式構(gòu)造函數(shù)調(diào)用。
我們可以使用this關(guān)鍵字將當(dāng)前對象作為參數(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);
在這里,我們通過將this作為參數(shù)傳遞來調(diào)用add()方法。因?yàn)閠his關(guān)鍵字包含對類的對象obj的引用,所以我們可以在add()方法中更改x和y的值。