前面介紹了類的基本定義,包括成員屬性、成員方法、構造方法幾個組成要素,可謂是具備了類的完整封裝形態。不過在進行下一階段的學習之前,有必要梳理一下前述的類定義代碼,看看是否存在哪些需要優化的地方。首先觀察以下的代碼片段,主要是重量屬性的定義及其設置方法: 註意到setWeight方法的輸入參數名叫in ...
前面介紹了類的基本定義,包括成員屬性、成員方法、構造方法幾個組成要素,可謂是具備了類的完整封裝形態。不過在進行下一階段的學習之前,有必要梳理一下前述的類定義代碼,看看是否存在哪些需要優化的地方。
首先觀察以下的代碼片段,主要是重量屬性的定義及其設置方法:
// 定義了橘子的重量 private double weight; // 設置橘子的重量 public void setWeight(double inputWeight) { weight = inputWeight; }
註意到setWeight方法的輸入參數名叫inputWeight,而重量屬性的名稱則為weight,之所以給參數名與屬性名分配不同的名稱,是因為在setWeight方法裡面,蹦出一個名叫weight的家伙,編譯器焉知這是名叫weight的輸入參數,還是名叫weight的成員屬性?事實上,對於名稱一樣的輸入參數和成員屬性,該方法內部只會把這個weight當作輸入參數,而非成員屬性。這就帶來一個問題:萬一不幸遇到參數名與屬性名相同的情況,如何才能在方法內部操作同名的成員屬性?為此Java提供了this關鍵字,它用於指代當前類自身,於是“this.變數名”就表示該類指定名稱的成員屬性了。如此一來,處理橘子重量的相關代碼便可改成下麵這樣:
// 定義了橘子的重量 private double weight; // 設置橘子的重量 public void setWeight(double weight) { this.weight = weight; }
關鍵字this不僅用於修飾成員屬性,也能用於修飾成員方法,且看以下的構造方法代碼:
// 只有一個輸入參數的構造方法 public OrangeThis(String inputPlace) { place = inputPlace; if (place.equals("淮北")) { name = "枳子"; } else { name = "橘子"; } }
可見該構造方法的內部代碼只是設置橘子的產地,順帶修改橘子的名稱,其作用等同於setPlace這個成員方法。故而以上的構造方法完全可以簡化成下麵這般:
// 只有一個輸入參數的構造方法 public OrangeThis(String place) { // 調用該類的成員方法 this.setPlace(place); }
由於此處setPlace指的必定是成員方法setPlace,而不可能是別的什麼東西,因此這裡的首碼“this.”可加可不加,不加也沒有任何不良影響。所以類內部調用成員方法通常不加關鍵字this,此時構造方法的代碼如下所示:
// 只有一個輸入參數的構造方法 public OrangeThis(String place) { // 調用該類的成員方法 setPlace(place); // 此時成員方法前面的this可加可不加,即使不加也不會產生歧義 //this.setPlace(place); }
再來看以下的另一個構造方法,它擁有三個輸入參數:
// 擁有三個輸入參數的構造方法 public OrangeThis(String inputPlace, double inputWeight, boolean inputRipe) { place = inputPlace; if (place.equals("淮北")) { name = "枳子"; } else { name = "橘子"; } weight = inputWeight; isRipe = inputRipe; }
以上的構造方法,內部代碼的前半部分仍舊是設置橘子產地並修改橘子名稱,其功能與前述的構造方法“OrangeThis(String place)”雷同。既然前面的構造方法已經實現了同樣的功能,後面的構造方法不妨直接調用前一個構造方法,這時依然利用關鍵字this代替構造方法之前的類名,譬如語句“this();”表示調用當前類預設的構造方法。那麼依樣畫瓢,語句“this(place);”表達的便是擁有一個輸入參數的構造方法了,這下可將原先帶三個輸入參數的構造方法改寫成如下代碼:
// 擁有三個輸入參數的構造方法 public OrangeThis(String place, double weight, boolean isRipe) { // 在一個構造方法中調用另一個構造方法,不能直接寫類的名稱,而要使用this指代構造方法 this(place); this.weight = weight; this.isRipe = isRipe; }
現在好了,不但類的局部代碼得到了簡化,並且實現了方法復用,從而增強了代碼的可維護性。
更多Java技術文章參見《Java開發筆記(序)章節目錄》