ThinkingInJava对this关键字的介绍
this 關鍵字
如果有兩個同類型的對象,分別叫作a 和b,那么您也許不知道如何為這兩個對象同時調用一個 f()方法:
class Banana { void f(int i) { /* ... */ } } Banana a = new Banana(), b = new Banana(); a.f(1); b.f(2);若只有一個名叫f()的方法,它怎樣才能知道自己是為 a 還是為 b 調用的呢?
為了能用簡便的、面向對象的語法來書寫代碼——亦即“將消息發給對象”,編譯器為我們完成了一些幕后
工作。其中的秘密就是第一個自變量傳遞給方法f(),而且那個自變量是準備操作的那個對象的句柄。所以
前述的兩個方法調用就變成了下面這樣的形式:
這是內部的表達形式,我們并不能這樣書寫表達式,并試圖讓編譯器接受它。但是,通過它可理解幕后到底
發生了什么事情。
假定我們在一個方法的內部,并希望獲得當前對象的句柄。由于那個句柄是由編譯器“秘密”傳遞的,所以
沒有標識符可用。然而,針對這一目的有個專用的關鍵字:this。this 關鍵字(注意只能在方法內部使用)
可為已調用了其方法的那個對象生成相應的句柄。可象對待其他任何對象句柄一樣對待這個句柄。但要注
意,假若準備從自己某個類的另一個方法內部調用一個類方法,就不必使用this。只需簡單地調用那個方法
即可。當前的this 句柄會自動應用于其他方法。所以我們能使用下面這樣的代碼:
在pit()內部,我們可以說 this.pick(),但事實上無此必要。編譯器能幫我們自動完成。this 關鍵字只能
用于那些特殊的類——需明確使用當前對象的句柄。例如,假若您希望將句柄返回給當前對象,那么它經常
在return 語句中使用。
由于increment()通過 this 關鍵字返回當前對象的句柄,所以可以方便地對同一個對象執行多項操作。
1. 在構建器里調用構建器
若為一個類寫了多個構建器,那么經常都需要在一個構建器里調用另一個構建器,以避免寫重復的代碼。可
用this 關鍵字做到這一點。
通常,當我們說this 的時候,都是指“這個對象”或者“當前對象”。而且它本身會產生當前對象的一個句
柄。在一個構建器中,若為其賦予一個自變量列表,那么 this 關鍵字會具有不同的含義:它會對與那個自變
量列表相符的構建器進行明確的調用。這樣一來,我們就可通過一條直接的途徑來調用其他構建器。如下所
示:
其中,構建器Flower(String s,int petals)向我們揭示出這樣一個問題:盡管可用this 調用一個構建器,
但不可調用兩個。除此以外,構建器調用必須是我們做的第一件事情,否則會收到編譯程序的報錯信息。
這個例子也向大家展示了this 的另一項用途。由于自變量s 的名字以及成員數據s 的名字是相同的,所以會
出現混淆。為解決這個問題,可用 this.s 來引用成員數據。經常都會在 Java 代碼里看到這種形式的應用,
本書的大量地方也采用了這種做法。
在print()中,我們發現編譯器不讓我們從除了一個構建器之外的其他任何方法內部調用一個構建器。
個人總結:
this關鍵字必須寫在構造方法內部
在構造函數中,如果你不指定構造器之間的調用關系,那么編譯器會給你加上super();目的是在初始化當前對象時,先保證了父類對象先初始化。所以,你指定了構造函數間的調用,那么this()必須在第一行,以保證在執行任何動作前,對象已經完成了初始化。
構造函數只能被構造函數調用,因為對象只會初始化一次。
構造方法調用語句放在第一
為了避免構建出兩個對象這種問題的出現,Java在編譯時對這種情況做了強校驗,用戶不能再同一個方法內調用多次this()或super(),同時為了避免對對象本身進行操作時,對象本身還未構建成功(也就找不到對應對象),所以對this()或super()的調用只能在構造方法中的第一行實現,防止異常。
在構造方法內部,只能調用一個構造方法
類似this()和super()這樣的方法被稱為構造方法,顧名思義,他的作用就是在JVM堆中構建出一個指定類型的對象,如果你調用了兩個這種形式的方法,豈不是代表著構建出了兩個對象。
非構造方法不能在方法內部調用構造方法
在普通的成員方法中,如果調用super()或者this(),你是想要重新創建一個對象嗎?抱歉Java為了保證自身對象的合理性,不允許你做這樣的操作。
參考文章
http://blog.csdn.net/lsly521/article/details/52243783
轉載于:https://www.cnblogs.com/aotemanzhifu/p/9192425.html
總結
以上是生活随笔為你收集整理的ThinkingInJava对this关键字的介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编程面试题之——简答题(持续更新...)
- 下一篇: Java IO流