應(yīng)用一:引用成員變量
- public class Student{ //定義一個(gè)類(lèi),,類(lèi)的名字為student。
- public Student(){ //定義 一個(gè)方法,,名字與類(lèi)相同故為構(gòu)造方法
- this(“l(fā)uobo”)
- }
- public Student(String name){ //定義一個(gè)帶形式參數(shù)的構(gòu)造方法
- }
- }
如上面這個(gè)代碼中,,有一個(gè)成員變量name,。同時(shí)在方法中有個(gè)形式參數(shù),名字也是name,。然 后再方法中將形式參數(shù)name的值傳遞給成員變量name,。雖然我們可以看明白這個(gè)代碼的含義,但是作為 Java編譯器它是怎么判斷的呢?到底是將形式參數(shù)name的值傳遞給成員變量name,,還是反過(guò)來(lái)講成員變量 name的值傳遞給形式參數(shù)name呢?也就是說(shuō),,兩個(gè)變量名字如果相同的話(huà),那么Java如何判斷使用哪個(gè)變 量?此時(shí)this這個(gè)關(guān)鍵字就起到作用了,。This這個(gè)關(guān)鍵字其代表的就是對(duì)象中的成員變量或者方法,。也就 是說(shuō),如果在某個(gè)變量前面加上一個(gè)this關(guān)鍵字,,其指的就是這個(gè)對(duì)象的成員變量或者方法,,而不是指成 員方法的形式參數(shù)或者局部變量。為此在上面這個(gè)代碼中,,this.name代表的就是對(duì)象中的成員變量,,又 叫做對(duì)象的屬性。而后面的name則是方法的形式參數(shù),。代碼this.name=name就是將形式參數(shù)的值傳遞給成 員變量,。這就是上面這個(gè)代碼的具體含義。
一般情況下,,在Java語(yǔ)言中引用成員變量或者成員方法都是以對(duì)象名.成員變量或者對(duì)象名.成員 方法的形式,。不過(guò)有些程序員即使在沒(méi)有相同變量的時(shí)候,也喜歡使用this.成員變量的形式來(lái)引用變量 ,。這主要是從便于代碼的閱讀考慮的,。一看到這個(gè)this關(guān)鍵字就知道現(xiàn)在引用的變量是成員變量或者成員 方法,而不是局部變量,。這無(wú)形中就提高了代碼的閱讀性,。不過(guò)話(huà)說(shuō)回來(lái),這是this關(guān)鍵字在Java語(yǔ)言中 的最簡(jiǎn)單的應(yīng)用,。從這個(gè)應(yīng)用中,我們可以看出this關(guān)鍵字其代表的就是對(duì)象的名字,。掌握這個(gè)基本的原 理之后,,再了解后續(xù)的一些高級(jí)應(yīng)用,也就是水到渠成的事情了,。
筆者這里只是以一個(gè)形式參數(shù)為例,。其實(shí)如果是局部變量的話(huà),也是相同的道理,。如在上面的代 碼中,,name不是形式參數(shù),而是一個(gè)局部變量。此時(shí)Java也會(huì)遇到相同的疑惑,,即變量名name代表的到底 是局部變量還是形式參數(shù)?name=name到底代表的是什么含義?根據(jù)局部變量的作用域,,在方法內(nèi)部,如果 局部變量與成員變量同名的話(huà),,那么是以局部變量為準(zhǔn),。可是在name=name這個(gè)賦值語(yǔ)句中,,將局部變量 的值賦值給自己,,顯然并不是很合適。根據(jù)代碼的含義,,本來(lái)的意思應(yīng)該是將局部變量賦值給成員變量,。 為了更清晰的表達(dá)這個(gè)含義,為此最好采用如下的書(shū)寫(xiě)格式:this.name=name,。這里的this關(guān)鍵字含義就 是對(duì)象名student,。為此this.name就表示student.name。這就轉(zhuǎn)換為正規(guī)的成員變量應(yīng)用了,。
應(yīng)用二:調(diào)用類(lèi)的構(gòu)造方法
在一個(gè)Java類(lèi)中,,其方法可以分為成員方法和構(gòu)造方法兩種。構(gòu)造方法是一個(gè)與類(lèi)同名的方法,, 在Java類(lèi)中必須存在一個(gè)構(gòu)造方法,。如果在代碼中沒(méi)有顯示的體現(xiàn)構(gòu)造方法的話(huà),那么編譯器在編譯的時(shí) 候會(huì)自動(dòng)添加一個(gè)沒(méi)有形式參數(shù)的構(gòu)造方法,。這個(gè)構(gòu)造方法跟普通的成員方法還是有很多不同的地方,。如 構(gòu)造方法的話(huà)一律是沒(méi)有返回值的。而且也不用void關(guān)鍵字來(lái)說(shuō)明這個(gè)構(gòu)造方法沒(méi)有返回值,。而普通的方 法可以有返回值,、也可以沒(méi)有返回值,程序員可以根據(jù)自己的需要來(lái)定義,。不過(guò)如果普通的方法沒(méi)有返回 值的話(huà),,那么一定要在方法定義的時(shí)候采用void關(guān)鍵字來(lái)進(jìn)行說(shuō)明。其次構(gòu)造方法的名字有嚴(yán)格的要求,, 即必須與類(lèi)的名字相同,。也就是說(shuō),Java編譯器發(fā)現(xiàn)有個(gè)方法與類(lèi)的名字相同才把其當(dāng)作構(gòu)造方法來(lái)對(duì)待 ,。而對(duì)于普通方法的話(huà),,則要求不能夠與類(lèi)的名字相同,而且多個(gè)成員方法不能夠采用相同的名字,。在一 個(gè)類(lèi)中可以存在多個(gè)構(gòu)造方法,,這些構(gòu)造方法都采用相同的名字,。只是形式參數(shù)不同。Java語(yǔ)言就憑用戶(hù) 參數(shù)的參數(shù)來(lái)判斷調(diào)用那個(gè)構(gòu)造方法,。
this關(guān)鍵字除了可以調(diào)用成員變量之外,,還可以調(diào)用構(gòu)造方 法。如下面的代碼:
- public class Student{ //定義一個(gè)類(lèi),,類(lèi)的名字為student,。
- public Student(){ //定義一個(gè)方法,名字與類(lèi)相同故為構(gòu)造方法
- this(“l(fā)uobo”)
- }
- public Student(String name){ //定義一個(gè)帶形式參數(shù)的構(gòu)造方法
- }
- }
在上面這個(gè)代碼中,,筆者定義了兩個(gè)構(gòu)造方法,,一個(gè)帶參數(shù),另一個(gè)沒(méi)有帶參數(shù),。構(gòu) 造方法都不會(huì)有返回值,,不過(guò)由于構(gòu)造方法的特殊性,為此不必要在構(gòu)造方法定義時(shí)帶上void關(guān)鍵字來(lái)說(shuō) 明這個(gè)問(wèn)題,。在第一個(gè)沒(méi)有帶參數(shù)的構(gòu)造方法中,,筆者使用了this(“l(fā)uobo”)這個(gè)代碼。這個(gè)代碼表示 什么含義呢?在構(gòu)造方法中使this關(guān)鍵字表示調(diào)用類(lèi)中的構(gòu)造方法,。如果一個(gè)類(lèi)中有多個(gè)構(gòu)造方法,,因?yàn)?其名字都相同,跟類(lèi)名一致,,那么這個(gè)this到底是調(diào)用哪個(gè)構(gòu)造方法呢?其實(shí),,這跟采用其他方法引用構(gòu) 造方法一樣,都是通過(guò)形式參數(shù)來(lái)嗲用構(gòu)造方法的,。如上例中,,this關(guān)鍵字后面加上了一個(gè)參數(shù),那么就 表示其引用的是帶參數(shù)的構(gòu)造方法,。如果現(xiàn)在有三個(gè)構(gòu)造方法,,分別為不帶參數(shù)、帶一個(gè)參數(shù),、帶兩個(gè)參 數(shù),。那么Java編譯器會(huì)根據(jù)所傳遞的參數(shù)數(shù)量的不同,來(lái)判斷該調(diào)用哪個(gè)構(gòu)造方法,。從上面這個(gè)示例中可 以看出,,this關(guān)鍵字不僅可以用來(lái)引用成員變量,而且還可以用來(lái)引用構(gòu)造方法,。
不過(guò)如果要使用這種方式來(lái)調(diào)用構(gòu)造方法的話(huà),,有一個(gè)語(yǔ)法上的限制,。一般來(lái)說(shuō),,利用this關(guān)鍵 字來(lái)調(diào)用構(gòu)造方法,,只有在無(wú)參數(shù)構(gòu)造方法中第一句使用this調(diào)用有參數(shù)的構(gòu)造方法。否則的話(huà),,翻譯的 時(shí)候,,就會(huì)有錯(cuò)誤信息。這跟引用成員變量不同,。如果引用成員變量的話(huà),,this關(guān)鍵字是沒(méi)有位置上的限 制的。如果不熟悉這個(gè)限制的話(huà),,那么還是老老實(shí)實(shí)的采用傳統(tǒng)的構(gòu)造方法調(diào)用方式為好,。雖然比較麻煩 ,但是至少不會(huì)出錯(cuò),。
應(yīng)用三:返回對(duì)象的值
this關(guān)鍵字除了可以引用變量或者成員方法之外,,還有一個(gè)重大的作用就是返回類(lèi)的飲用。如在 代碼中,,可以使用return this,,來(lái)返回某個(gè)類(lèi)的引用。此時(shí)這個(gè)this關(guān)鍵字就代表類(lèi)的名稱(chēng),。如這個(gè)代 碼在上面這個(gè)student類(lèi)中,,那么這個(gè)代碼其代表的含義就是return student??梢?jiàn),,這個(gè)this關(guān)鍵字除 了可以引用變量或者成員方法之外,還可以做為類(lèi)的返回值,。這才是this關(guān)鍵字最引人注意的地方,。
在使用this關(guān)鍵字的時(shí)候,需要注意一個(gè)細(xì)節(jié)問(wèn)題,。在筆者談到的第一個(gè)案例中,,利用this關(guān)鍵 字來(lái)引用成員變量。即this.name=name,。這個(gè)語(yǔ)句是將局部變量或則形式參數(shù)賦值給成員變量,。其實(shí),此 時(shí)這個(gè)this關(guān)鍵字不加也可以起到類(lèi)似的效果,。即上面這個(gè)語(yǔ)句中,,與name=name這個(gè)語(yǔ)句時(shí)相同的。即 Java編譯器會(huì)自動(dòng)將第一個(gè)name當(dāng)作成員變量來(lái)對(duì)待,。而將等號(hào)右邊的name變量當(dāng)作形式參數(shù),。雖然這么 書(shū)寫(xiě)代碼,可以節(jié)省this這幾個(gè)字符的輸入,。但是對(duì)于代碼的閱讀是不利的,。為此,,從代碼的閱讀性考慮 ,如果成員變量與形式參數(shù)或者局部變量相同的話(huà),,那么最好是使用this.成員變量(成員方法)的方式來(lái) 引用成員變量,。雖然語(yǔ)法上沒(méi)有錯(cuò)誤,但是作為一個(gè)高級(jí)的JAVA程序員,,在代碼書(shū)寫(xiě)的規(guī)范上,,也不能夠 忽視。