Java this關鍵字詳解
this 關鍵字用來表示當前對象本身,或當前類的一個實例,通過this 可以調用本對象的所有方法和屬性。例如:
public class Demo{ public int x = 10; public int y = 15; public void sum(){ // 通過this 點取成員變量int z = this.x + this.y; System.out.println("x + y = " + z); } public static void main(String[] args) { Demo obj = new Demo(); obj.sum(); }}
運行結果:
x + y = 25
上面的程序中,obj 是Demo 類的一個實例,this 與obj 等價,執行int z = this.x + this.y;,就相當於執行int z = obj.x + obj.y;。
注意:this 只有在類實例化後才有意義。
使用this區分同名變量
成員變量與方法內部的變量重名時,希望在方法內部調用成員變量,怎麼辦呢?這時候只能使用this,例如:
public class Demo{ public String name; public int age; public Demo(String name, int age){ this.name = name; this.age = age; } public void say(){ System.out.println("網站的名字是" + name + ",已經成立了" + age + "年"); } public static void main(String[] args) { Demo obj = new Demo("微學苑", 3); obj.say( ); }}
運行結果:
網站的名字是微學苑,已經成立了3年
形參的作用域是整個方法體,是局部變量。在Demo()中,形參和成員變量重名,如果不使用this,訪問到的就是局部變量name和age,而不是成員變量。在say() 中,我們沒有使用this,因為成員變量的作用域是整個實例,當然也可以加上this:
public void say(){ System.out.println("網站的名字是" + this.name + ",已經成立了" + this.age + "年");}
Java 默認將所有成員變量和成員方法與this 關聯在一起,因此使用this 在某些情況下是多餘的。
作為方法名來初始化對象
也就是相當於調用本類的其它構造方法,它必須作為構造方法的第一句。示例如下:
public class Demo{ public String name; public int age; public Demo(){ this("微學苑", 3); } public Demo(String name, int age){ this.name = name; this.age = age; } public void say(){ System.out.println("網站的名字是" + name + ",已經成立了" + age + "年"); } public static void main(String[] args) { Demo obj = new Demo(); obj.say(); }}
運行結果:
網站的名字是微學苑,已經成立了3年
值得注意的是:
在構造方法中調用另一個構造方法,調用動作必須置於最起始的位置。
不能在構造方法以外的任何方法內調用構造方法。
在一個構造方法內只能調用一個構造方法。
上述代碼涉及到方法重載,即Java允許出現多個同名方法,只要參數不同就可以。後續章節會講解。
作為參數傳遞
需要在某些完全分離的類中調用一個方法,並將當前對象的一個引用作為參數傳遞時。例如:
public class Demo{ public static void main(String[] args){ B b = new B(new A()); }}class A{ public A(){ new B(this).print(); // 匿名對象} public void print(){ System.out.println("Hello from A!"); }}class B{ A a; public B(A a){ this.a = a; } public void print() { a.print(); System.out.println("Hello from B!"); }}
運行結果:
Hello from A!Hello from B!
匿名對象就是沒有名字的對象。如果對像只使用一次,就可以作為匿名對象,代碼中new B(this).print(); 等價於( new B(this) ).print();,先通過new B(this) 創建一個沒有名字的對象,再調用它的方法。
Java方法重載<br />在Java中,同一個類中的多個方法可以有相同的名字,只要它們的參數列表不同就可以,這被稱為方法重載(method overloading)。
參數列表又叫參數簽名,包括參數的類型、參數的個數和參數的順序,只要有一個不同就叫做參數列表不同。
重載是面向對象的一個基本特性。
下面看一個詳細的實例。
public class Demo{ // 一個普通的方法,不帶參數void test(){ System.out.println("No parameters"); } // 重載上面的方法,並且帶了一個整型參數void test( int a){ System.out.println("a: " + a); } // 重載上面的方法,並且帶了兩個參數void test(int a,int b){ System.out.println(" a and b: " + a + " " + b); } // 重載上面的方法,並且帶了一個雙精度參數double test(double a){ System.out.println("double a: " + a ); return a*a; } public static void main(String args[]){ Demo obj= new Demo(); obj.test(); obj.test(2); obj.test(2,3); obj .test(2.0); }}
運行結果:
No parametersa: 2a and b: 2 3double a: 2.0
通過上面的實例,讀者可以看出,重載就是在一個類中,有相同的函數名稱,但形參不同的函數。重載的結果,可以讓一個程序段盡量減少代碼和方法的種類。
說明:
方法的重載的規則:
方法重載的實現:
方法名稱相同時,編譯器會根據調用方法的參數個數、參數類型等去逐個匹配,以選擇對應的方法,如果匹配失敗,則編譯器報錯,這叫做重載分辨。