java中this用法總結
1,當局部變數和成員變數重名的時候,在方法中使用this表示成員變數以示區分。
class Demo{ String str = "這是成員變數"; void fun(String str){ System.out.println(str); System.out.println(this.str); this.str = str; System.out.println(this.str); } } public class This{ public static void main(String args[]){ Demo demo = new Demo(); demo.fun("這是區域性變數"); } }
分析:上面的類Demo中有一個成員變數str和一個區域性變數str(類方法中的形式引數),很顯然區域性變數和成員變數重名,這個時候一般在方法中直接使用str實際上是使用區域性變數str,對成員變數str沒有任何影響,此時如果需要對成員變數做點什麼,就必須使用this關鍵字。
有個問題,如果方法中沒有str,那麼在方法中使用成員變數str會是什麼情況呢?實際上是方法內的所有操作都是針對成員變數str的。java程式設計思想的84頁中部有這樣一句話:如果在方法內部呼叫同一個類的另一個方法,就不必使用this。同樣,在一個方法中如果沒有區域性變數和成員變數同名,那麼在這個方法中使用成員變數也不必使用this,可以執行下面的程式碼看看。
class Demo{ String str = "這是成員變數"; void fun(String str1){ System.out.println(str1); System.out.println(str); } } public class This{ public static void main(String args[]){ Demo demo = new Demo(); demo.fun("這是區域性變數"); } }
2,this關鍵字把當前物件傳遞給其他方法
這裡有個很經典的例子,就是java程式設計思想的85頁的例子。我們拿出來仔細研究。
class Person{ public void eat(Apple apple){ Apple peeled = apple.getPeeled(); System.out.println("Yummy"); } } class Peeler{ static Apple peel(Apple apple){ //....remove peel return apple; } } class Apple{ Apple getPeeled(){ return Peeler.peel(this); } } public class This{ public static void main(String args[]){ new Person().eat(new Apple()); } }
這是我自己的認識,也許不正確,看看書中是怎樣說的:Apple需要呼叫Peeler.peel()方法,他是一個外部的工具方法,將執行由於某種原因而必須放在Apple外部的操作(也許是因為該外部方法要應用於許多不同的類,而你卻不想重複這些程式碼)。為了將其自身傳遞給外部方法,必須使用this關鍵字。
分析:設想一個場景,假如各種水果去皮的工作都是一樣的,只要給我水果,我都按同樣的方法去皮。那麼結合上面的例子,傳進來一個水果,我們吃之前getPeeled(),必須將此水果作為引數傳遞給外部的peel(),用this來代表自身傳遞給外部方法。
3,當需要返回當前物件的引用時,就常常在方法寫return this;
這種做法的好處是:當你使用一個物件呼叫該方法,該方法返回的是經過修改後的物件,且又能使用該物件做其他的操作。因此很容易對一個物件進行多次操作。
public class This{ int i = 0; This increment(){ i += 2; return this; } void print(){ System.out.println("i = " + i); } public static void main(String args[]){ This x = new This(); x.increment().increment().print(); } }
結果為:4
4,傳遞多個引數
在網上看到this的如下功能:http://blog.csdn.net/anmei2010/article/details/4091227
其實我覺得這和本文的第二條一樣,就是使用this把自身物件作為引數傳遞給一個工具方法,不同的是這裡的工具方法是在本類中而已。其實大家可以分析這兩種的區別。
5,在構造器中呼叫構造器需要使用this。
一個類有許多建構函式,有時候想在一個建構函式中呼叫其他建構函式,以避免程式碼重複,可以使用this關鍵字。在java程式設計思想中有這樣一段話:通常寫this的時候,都是指“這個物件”或者“當前物件”,而且它本身表示對當前物件的引用。在構造器中,如果為this添加了引數列表,那麼就有不同的含義。這將產生對符合此引數列表的某個構造器的明確呼叫;這樣呼叫其他建構函式就有了直接的途徑。
仔細分析:從主函式開始,new Flower()會在記憶體分配空間,初始化物件,初始化物件是呼叫建構函式,這裡沒有寫任何引數,當然是呼叫預設建構函式,就是那個無參的構函式。這個無參的建構函式的第一行程式碼就是this("hi",122);這裡的意思是該無參建構函式又去呼叫帶兩個引數的建構函式,來到帶兩個引數的建構函式,第一行程式碼是this(s);這行程式碼自動匹配帶一個引數的建構函式,發現Flower(String ss)這個比較匹配,都是String型別的引數。然後呼叫了帶有一個String型別引數的建構函式,列印:只有String型別的引數的建構函式 s = hi;然後回到上一級呼叫函式,就是帶有兩個引數的建構函式,列印輸出:有String和int型別的引數的建構函式;再回到上一級,就是無參建構函式,列印:預設建構函式。此時建構函式已經初始化完成新建的物件,最後在主函式的最後一行程式碼中列印:petalCount=122 s=hi。
畫個圖看得更明白。
有幾點要注意:
1,this只可以呼叫一個構造器,在一個構造器中不能同時呼叫兩個構造器;
2,必須將你所呼叫的構造器放在最開始的位置,這也解釋了為什麼不能在一個建構函式中呼叫兩個構造器,那第二個勢必不在最開始位置。
3,本例中在帶有兩個引數的建構函式中可以用this呼叫其他任意一個只有一個引數的建構函式,這取決你自己,隨便調哪一個都可以。
4,在建構函式之外的方法內不能使用this呼叫建構函式。程式碼裡面註釋的都不能正確編譯。
6,this總結
1、表示對當前物件的引用!
2、表示用類的成員變數,而非函式引數。
3、用於在構造方法中引用滿足指定引數型別的構造器(其實也就是構造方法)。但是這裡必須非常注意:只能引用一個構造方法且必須位於開始!
4、很明顯this不能用在static方法中,因為this指代當前物件,而static則無物件之說。