this 關鍵字有三個應用:
1.this調用本類中的屬性,也就是類中的成員變量
2.this調用本類中的其他方法
3.this調用本類中的其他構造方法,調用時要放在構造方法的首行
來看下面這段代碼:
public String name;public void showName(String name) {System.out.println(name);
}
上面的代碼中有個叫name的成員變量,也有個同樣叫name的方法參數。那么showName方法會輸出參數的name還是成員變量name呢?
測試代碼:
Foo foo = new Foo();
foo.name = "張三";
foo.showName("李四");
運行結果:
李四
運行結果顯示答案是會輸出參數的name,原因是Java語法獲取變量的時候采取的是就近原則所以name代表的是離它最近的參數name。如果想要輸出成員變量name怎么辦,把參數名name改了嗎?那又得多想一個變量名多麻煩啊。還好Java提供了this關鍵字可以引用類的對象。
把上面的代碼改成:
public String name;public void showName(String name) {System.out.println("我是方法參數:" + name);System.out.println("我是類的屬性:" + this.name);
}
運行結果:
我是方法參數:李四
我是類的屬性:張三
可以看出this關鍵字代表調用改方法的對象,此時相當于對象foo。
再來看一個例子。
public Foo returnThis() {return this;
}public Foo getInstance() {return new Foo();
}
測試代碼:
Foo foo = new Foo();Foo foo2 = foo.returnThis();
Foo foo3 = foo.getInstance();
System.out.println("foo和foo2是同一對象嗎? --> " + (foo == foo2));
System.out.println("foo和foo3是同一對象嗎? --> " + (foo == foo3));
運行結果:
foo和foo2是同一對象嗎? --> true
foo和foo3是同一對象嗎? --> false
這個例子很明確的說明了“this關鍵字代表調用改方法的對象”,該例子中return this返回的是調用該方法的對象也就是foo,所以foo2和foo指向的是同一對象。而 new Foo是創建一個新的Foo對象。所以foo3和foo并不指向同一對象。
?