IT技術-基礎篇 聊聊Java中的this關鍵字

前言

在很早的時候,我曾試圖透過網上的資源去更全面的瞭解Java中this的作用,但很遺憾不是沒有,而是沒有一篇看了能清晰的文章,內容都一樣,畢竟this關鍵字也確實只有那麼點東西可以聊的,但是是真的亂,希望這篇文章不是在內容而是在組織與呈現更到位些吧。

概念

IT技術-基礎篇 聊聊Java中的this關鍵字

this關鍵字只能在方法內部使用,表示對“呼叫方法的那個物件”的引用。概念就這麼簡單,其實它與我們前面提到的引用沒有區別,就是當前所屬物件的引用。

契機

既然this關鍵字與普通引用一樣,為什麼要設計這麼一個關鍵字呢?假設建立了某個物件同時要擁有該物件的引用,我們再操作物件的屬性或方法是一件很簡單的事情,但是如果我需要在該物件的某個方法內部使用當前物件的引用進行其它操作呢?每定義一個需要內部使用當前物件引用的方法時,將其引用做為形參?顯然這種方式略顯傻瓜了。

還是那句話,我們使用者能想到的問題,那麼操碎心的開發者會發現不了麼。其實在我們呼叫每個方法時開發者都設計成了隱藏式的將當前其引用做為第一個形參傳遞到了方法內部(當然這一步是編譯器替我們實現的)。如此一來這個隱藏式的形參在使用者需要明確使用時發現對於它並沒有一個明確的識別符號,this關鍵字就誕生了。

使用

屬性

IT技術-基礎篇 聊聊Java中的this關鍵字

透過上圖咱們可以發現在showInfo方法中使用name時顯式的使用this,而age使用時並無顯式使用this。沒有錯showInfo這個方法的使用必須伴隨著Person這個類的物件建立並由其引用進行操作,就如同上文說到的,在使用showInfo時,編譯器就會將其改造為showInfo(引用)。

方法

IT技術-基礎篇 聊聊Java中的this關鍵字

透過上圖咱們又換了一種寫法,就是在使用name和age時是透過呼叫方法來獲取的,同直接使用屬性一樣,在使用方法時也可顯式使用this,亦可以省略。

構造方法

IT技術-基礎篇 聊聊Java中的this關鍵字

如上圖,咱們在使用構造方法時,如果給this加上了形參,那麼它的意義就改變了,它代表著要複用其它重構的構造方法。在這裡咱們用四個例子說明下其使用上的區別:

問題一

可以看到問題一位置是一個無參構造方法,透過new Person();創建出來的物件,它的name與age是完全一樣的,在其內部透過this(“無名氏”, 999);複用了全參構造方法,這種使用是為在設計上達到複用程式碼的目的,否就要像同題四中一樣,將其程式碼重複寫一次。

問題二和問題三

IT技術-基礎篇 聊聊Java中的this關鍵字

這裡咱們結合二和三兩個問題一起看,這兩個位置其實均可以如問題一中一樣呼叫全參構造方法,但是呢這個問題在問題一中已經展示過了,這裡呢咱們講的是另一外一個點位,對比會發現,二和三中均直接給name進行了賦值操作,但二中使用了this而三中並沒有使用,這就要說到另一個原則了“

就近原則

”,二與三的區別在於name在二中做為形參傳遞,如果二中沒有顯式指定this。name進行賦值,就會根據就近原則這個值就重新賦值給了形參,而不會對於物件屬性有任何影響。

注:透過上述程式碼還可看出在構造方法中透過this引用其它構造方法時,開發者規定必須放在方法的第一行同時僅能呼叫一次。如果呼叫完仍需對某些屬性賦值就要像問題二中一樣,單獨處理。

方法返回

IT技術-基礎篇 聊聊Java中的this關鍵字

寫法一

IT技術-基礎篇 聊聊Java中的this關鍵字

寫法二

IT技術-基礎篇 聊聊Java中的this關鍵字

這種使用是針對在方法執行結束將其物件的引用以返回內容的形式傳遞出來供後續操作繼續使用,這裡咱們對於Person這個類的toString方法透過之前提到的StringBuilder來拼接實現。這就讓程式碼優雅和直觀,畢竟在這裡就如同看到了輸出語句的格式一樣。

總結

在上述提及到的this使用中,屬性引用相關的其實站在開發者角度來講他們是不期望我們來顯式呼叫的,相反處處在顯式使用那就失去了高階語言幫我們做的一些工作的意義,更或者會對於那些無如此程式碼風格的人也是一種干擾。

在工作中,構造方法規避就近引起賦值失效與方法返回引用這兩點上使用意義還是很大而且頻繁的。

另外有仔細的人會發現StringBuilder的append方法中存在super的使用,這個就咱們明天要嘮的話題,明兒見您。