this 關(guān)鍵字用來表示當前對象本身撩独,或當前類的一個實例寺晌,通過 this 可以調(diào)用本對象的所有方法和屬性脖母。
例如:
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(); } }
運行結(jié)果:
x + y = 25
上面的程序中,obj 是 Demo 類的一個實例饮戳,this 與 obj 等價绪囱,執(zhí)行 int z = this.x + this.y;,就相當于執(zhí)行 int z = obj.x + obj.y;莹捡。
注意:this 只有在類實例化后才有意義。
使用this區(qū)分同名變量
成員變量與方法內(nèi)部的變量重名時扣甲,希望在方法內(nèi)部調(diào)用成員變量篮赢,這時候只能使用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("網(wǎng)站的名字是" + name + "琉挖,已經(jīng)成立了" + age + "年"); }
public static void main(String[] args) { Demo obj = new Demo("大帥哥", 3); obj.say(); } }
運行結(jié)果:
網(wǎng)站的名字是大帥哥启泣,已經(jīng)成立了3年
形參的作用域是整個方法體,是局部變量示辈。
在Demo()中寥茫,形參和成員變量重名,如果不使用this矾麻,訪問到的就是局部變量name和age纱耻,而不是成員變量芭梯。
在 say() 中,我們沒有使用 this弄喘,因為成員變量的作用域是整個實例玖喘,當然也可以加上 this:public void say(){ System.out.println("網(wǎng)站的名字是" + this.name + ",已經(jīng)成立了" + this.age + "年"); }
Java 默認將所有成員變量和成員方法與 this 關(guān)聯(lián)在一起蘑志,因此使用 this 在某些情況下是多余的累奈。
作為方法名來初始化對象
也就是相當于調(diào)用本類的其它構(gòu)造方法,它必須作為構(gòu)造方法的第一句急但。
示例如下:
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("網(wǎng)站的名字是" + name + "澎媒,已經(jīng)成立了" + age + "年"); }
public static void main(String[] args) { Demo obj = new Demo(); obj.say(); } }
運行結(jié)果:
網(wǎng)站的名字是帥哥,已經(jīng)成立了3年
值得注意的是:
在構(gòu)造方法中調(diào)用另一個構(gòu)造方法波桩,調(diào)用動作必須置于最起始的位置戒努。
不能在構(gòu)造方法以外的任何方法內(nèi)調(diào)用構(gòu)造方法。
在一個構(gòu)造方法內(nèi)只能調(diào)用一個構(gòu)造方法突委。
上述代碼涉及到方法重載柏卤,即Java允許出現(xiàn)多個同名方法,只要參數(shù)不同就可以匀油。
作為參數(shù)傳遞
需要在某些完全分離的類中調(diào)用一個方法缘缚,并將當前對象的一個引用作為參數(shù)傳遞時。
例如:
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!"); } }
運行結(jié)果:
Hello from A!
Hello from B!
匿名對象就是沒有名字的對象敌蚜。如果對象只使用一次桥滨,就可以作為匿名對象,代碼中 new B(this).print(); 等價于 ( new B(this) ).print();弛车,先通過 new B(this) 創(chuàng)建一個沒有名字的對象齐媒,再調(diào)用它的方法。