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