Java開發筆記(四十七)關鍵字this的用法

前面介紹了類的基本定義,包括成員屬性、成員方法、構造方法幾個組成要素,可謂是具有了類的完整封裝形態。不過在進行下一階段的學習以前,有必要梳理一下前述的類定義代碼,看看是否存在哪些須要優化的地方。
首先觀察如下的代碼片斷,主要是重量屬性的定義及其設置方法: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開發筆記(序)章節目錄開發

相關文章
相關標籤/搜索