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