前面介紹了類的基本定義,包括成員屬性、成員方法、構造方法幾個組成要素,可謂是具有了類的完整封裝形態。不過在進行下一階段的學習以前,有必要梳理一下前述的類定義代碼,看看是否存在哪些須要優化的地方。
首先觀察如下的代碼片斷,主要是重量屬性的定義及其設置方法:html
// 定義了橘子的重量 private double weight; // 設置橘子的重量 public void setWeight(double inputWeight) { weight = inputWeight; }
注意到setWeight方法的輸入參數名叫inputWeight,而重量屬性的名稱則爲weight,之因此給參數名與屬性名分配不一樣的名稱,是由於在setWeight方法裏面,蹦出一個名叫weight的傢伙,編譯器焉知這是名叫weight的輸入參數,仍是名叫weight的成員屬性?事實上,對於名稱同樣的輸入參數和成員屬性,該方法內部只會把這個weight看成輸入參數,而非成員屬性。這就帶來一個問題:萬一不幸遇到參數名與屬性名相同的狀況,如何才能在方法內部操做同名的成員屬性?爲此Java提供了this關鍵字,它用於指代當前類自身,因而「this.變量名」就表示該類指定名稱的成員屬性了。如此一來,處理橘子重量的相關代碼即可改爲下面這樣:java
// 定義了橘子的重量 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,此時構造方法的代碼以下所示:this
// 只有一個輸入參數的構造方法 public OrangeThis(String place) { // 調用該類的成員方法 setPlace(place); // 此時成員方法前面的this可加可不加,即便不加也不會產生歧義 //this.setPlace(place); }
再來看如下的另外一個構造方法,它擁有三個輸入參數:htm
// 擁有三個輸入參數的構造方法 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);」表達的即是擁有一個輸入參數的構造方法了,這下可將原先帶三個輸入參數的構造方法改寫成以下代碼:blog
// 擁有三個輸入參數的構造方法 public OrangeThis(String place, double weight, boolean isRipe) { // 在一個構造方法中調用另外一個構造方法,不能直接寫類的名稱,而要使用this指代構造方法 this(place); this.weight = weight; this.isRipe = isRipe; }
如今好了,不但類的局部代碼獲得了簡化,而且實現了方法複用,從而加強了代碼的可維護性。ip
更多Java技術文章參見《Java開發筆記(序)章節目錄》開發