Java008 this關鍵字(認真閱讀,會有收穫的哦,理解why)

Java008 this關鍵字(認真閱讀,會有收穫的哦,理解why)

①假設你希望在方法的內部獲得對當前對象的引用

②this關鍵字對於將當前對象傳遞給其他方法也很有用

③在構造器中調用構造器

④static的含義

 

Java008 this關鍵字(認真閱讀,會有收穫的哦,理解why)

如果由同一類型的兩個對象,分別是a和b,你可能向知道,如何才能讓這兩個對象都能調用peel()方法呢:

 
 

如果只有一個peel()方法,它如何知道是被a還是被b所調用的呢?(後期綁定呀)

爲了能簡便、面向對象的語法來編寫代碼-即“發送消息給對象”,編譯器做了一些幕後工作。它暗自把“所操作對象的引用”作爲第一個參數傳遞給peel()。所以,上述兩個方法的調用就變成了形如這個樣子的:Banana.peel(a,1);Banana.peel(b,2);這是內部的表示形式,我們並不這樣書寫代碼,並試圖通過編譯;但這種寫法的確能幫你瞭解實際所發生的事情。

①假設你希望在方法的內部獲得對當前對象的引用。

由於這個引用是編譯器“偷偷”傳入的,所以沒有標識符可用。但是,爲此有個專門的關鍵字:this。this關鍵字只能在方法內部使用,表示對“調用方法的那個對象”的引用。this的用法和其他對象引用並無不同。但是要注意,如果在方法內部調用同一個類的另一個方法,就不必使用this,直接調用即可。當前方法中的this引用會自動應用於同一個類中的其他方法。所以可用這樣寫代碼:

 
 

在pit()內部,你可以寫this.pick(),但是無此必要。編譯器能幫你自動添加。只有當需要明確指出對當前對象的引用時,才需要使用this關鍵字。例如,當需要返回對當前對象的引用時,就常常在return語句中這樣寫:

 
 

由於increment()通過this關鍵字返回了對當前對象的引用,所以很容易在一條語句理對同一個對象執行多次操作。

 

②this關鍵字對於將當前對象傳遞給其他方法也很有用。

 
 

 

Apple需要調用Peel.peel()方法,它是一個外部的工具方法,將執行由於某種原因而必需放在Apple外部的操作(也許是因爲該外部方法要應用於許多不同的類,而你卻不想重複這些代碼)。爲了將其自身傳遞給外部方法,Apple必需使用this關鍵字。

③在構造器中調用構造器

可能爲一個類寫了多個構造器,有時可能想在一個構造器中調用另一個構造器,以避免重複代碼。可用this關鍵字做到這一點。

通常寫this的時候,都是指“這個對象”或者“當前對象”,而且它本身表示對當前對象的引用。在構造器中,如果爲this添加了參數列表,那麼就有了不同的含義。這將產生對符合此參數列表的某個構造器的明確調用;這樣,調用其他構造器就有了直接的途徑。

儘管可用用this調用一個構造器,但卻不能調用兩個。此外,必須將構造器調用置於最起始處,否則編譯會報錯。

除構造器之外,編譯器禁止在其他任何方法中調用構造器。

④static的含義

瞭解this關鍵字之後,就能更全面的瞭解static(靜態)方法的含義。static方法就是沒有this的方法。在static方法的內部不能調用非靜態方法,反過來倒是可以。而且可以在沒有創建任何對象的前提下,僅僅通過類本身來調用static方法。這實際上正是static方法的主要用途。它很想全局方法。Java中禁止使用全局方法,但你在類中置入static方法就可以訪問其他static方法和staitc域。

有些人認爲static方法不是“面向對象”的,因爲它們的確具有全局函數的語義,使用static方法時,由於不存在this,所以不是通過“向對象發送消息”的方法來完成的。的確,要是在代碼中出現了大量的static方法,就該重新考慮自己的設計了。然而,static的概念有其實用之處,許多時候都要用到它。至於它是否真的“面向對象”,就留給理論家去討論吧。事實上,Smalltalk語言裏的“類方法”就是與static方法相對應的。

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章