1. 程式人生 > >Java開發筆記(四十七)關鍵字this的用法

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

前面介紹了類的基本定義,包括成員屬性、成員方法、構造方法幾個組成要素,可謂是具備了類的完整封裝形態。不過在進行下一階段的學習之前,有必要梳理一下前述的類定義程式碼,看看是否存在哪些需要優化的地方。
首先觀察以下的程式碼片段,主要是重量屬性的定義及其設定方法:

	// 定義了橘子的重量
	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開發筆記(序)章節目錄