Java基礎(chǔ)卻常被忽略:全面講解this的實(shí)戰(zhàn)技巧!
大家好,我是小米,一個(gè)熱愛分享技術(shù)的 29 歲程序員。最近,一位朋友跟我訴苦,說他參加了一場 Java 社招面試,面試官問了一個(gè)看似簡單卻讓人抓狂的問題——“請講講 this 關(guān)鍵字的用法?!?/p>
“這不是基礎(chǔ)到不能再基礎(chǔ)的問題嗎?居然問這個(gè)!”朋友心里這么想,但冷靜下來才發(fā)現(xiàn),雖然每天用 this,但真要系統(tǒng)解釋卻有點(diǎn)卡殼。于是,我決定整理一篇文章,幫大家理清楚 this 的各種妙用,順便解答幾個(gè)常見的面試陷阱。
this 是什么?
this 是 Java 中的一個(gè)關(guān)鍵字,簡單說,它代表當(dāng)前對象的引用。當(dāng)我們在類中調(diào)用它時(shí),this 指向當(dāng)前類的實(shí)例。它的主要作用包括:
- 區(qū)分類的成員變量和局部變量。
- 在構(gòu)造方法中調(diào)用其他構(gòu)造方法。
- 返回當(dāng)前對象(鏈?zhǔn)秸{(diào)用)。
- 作為參數(shù)傳遞。
來看幾個(gè)場景化的例子,理解它的用法。
區(qū)分成員變量和局部變量
先來看一個(gè)場景,小明是個(gè)初級開發(fā),剛寫完以下代碼:
圖片
小明很疑惑,為什么他調(diào)用setName("小米") 后,getName() 返回的還是null?其實(shí)問題出在name = name;這行代碼。
這里的兩個(gè) name 指的是同一個(gè)局部變量!如果想賦值給類的成員變量,必須用 this 來指明。
正確代碼如下:
圖片
這就是 this 的最基礎(chǔ)用法之一:區(qū)分同名變量。
在構(gòu)造方法中調(diào)用其他構(gòu)造方法
接下來,假設(shè)你要寫一個(gè) Person 類,有多個(gè)構(gòu)造方法。面試官可能會(huì)問:“如何避免構(gòu)造方法中代碼重復(fù)?”
用 this 來調(diào)用另一個(gè)構(gòu)造方法就是最佳答案!
來看代碼:
圖片
上面的代碼中,this(name, 0)調(diào)用了第二個(gè)構(gòu)造方法。這樣既減少了重復(fù)代碼,又方便統(tǒng)一管理邏輯。
注意:
- 構(gòu)造方法中調(diào)用其他構(gòu)造方法時(shí),this 必須是方法的第一行。
- 不允許循環(huán)調(diào)用構(gòu)造方法,否則會(huì)編譯錯(cuò)誤。
支持鏈?zhǔn)秸{(diào)用
面試中,很多人會(huì)提到鏈?zhǔn)秸{(diào)用。比如我們希望下面的代碼可以運(yùn)行:
圖片
實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用的關(guān)鍵就在于方法返回 this。代碼如下:
圖片
通過返回this,我們可以在一個(gè)語句中完成多個(gè)調(diào)用,大大提升代碼的可讀性和優(yōu)雅度。
作為參數(shù)傳遞
有時(shí)候,我們希望把當(dāng)前對象傳遞給另一個(gè)方法或?qū)ο?,這時(shí)候 this 就派上用場了!
比如,有一個(gè) Printer 類,負(fù)責(zé)打印對象的信息。我們可以這樣實(shí)現(xiàn):
圖片
調(diào)用person.print()時(shí),this 會(huì)將當(dāng)前對象傳遞給Printer 的print 方法,從而實(shí)現(xiàn)打印。
面試陷阱:this 的幾個(gè)誤區(qū)
1. 靜態(tài)方法中能不能使用 this?
不能!因?yàn)殪o態(tài)方法是屬于類的,而 this 是屬于實(shí)例的。在靜態(tài)方法中,this 根本不存在。
錯(cuò)誤示例:
圖片
2. this 可以出現(xiàn)在匿名內(nèi)部類中嗎?
可以!但是要注意 this 的含義。
匿名內(nèi)部類中,this 指的是匿名類實(shí)例,而不是外部類實(shí)例。如果需要引用外部類,可以用 外部類名.this 的方式。
示例代碼:
圖片
總結(jié)
通過今天的學(xué)習(xí),我們知道了 this 的四種常見用法:
- 區(qū)分成員變量和局部變量。
- 在構(gòu)造方法中調(diào)用其他構(gòu)造方法。
- 實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用。
- 作為參數(shù)傳遞。
同時(shí),我們也提醒自己:靜態(tài)方法中不能使用 this,匿名內(nèi)部類中要注意 this 的指向。