Java開發筆記(四十六)類的構造方法

pinlantu發表於2019-01-08

前面介紹瞭如何定義一個簡單的類,以及它的成員屬性和成員方法,從示例程式碼可以看到,不管是OrangeSimple還是OrangeMember,都要先利用關鍵字new建立一個例項,然後才能通過例項名稱訪問成員屬性和成員方法。不知道大家有沒有注意到,new後面的類名跟著一副圓括號,就像下面程式碼這樣:

		// 建立OrangeMember的一個例項
		OrangeMember orange = new OrangeMember();

 

可圓括號通常是方法的標配呀,為啥類名後面也能直接跟著圓括號呢?這是因為,類定義除了成員屬性和成員方法,還有一種構造方法,構造方法的用途是構建並返回該類的例項。比如“OrangeMember()”實際上對應的是類定義中的下述構造方法:

	// 預設的構造方法
	public OrangeMember() {
	}

 

由於構造方法就是要給外部建立例項用的,因此必須宣告為public對外開放;同時構造方法的返回值固定是該類的例項,便不必重複寫明它的返回值;至於類名後面的一對圓括號及一對花括號,顯然與普通方法的定義保持一致。但是之前OrangeSimple和OrangeMember的類定義都沒有看到它們的構造方法,這又是何故?原來上述形如“類名()”的構造方法,其實是預設的構造方法,即使程式設計師未在類定義中寫明該方法,Java在編譯之時也會自動補上預設的構造方法,所以對於簡單的類定義來說,不寫這個預設的構造方法,也不影響類的正常使用。
既然構造方法擁有一對圓括號,就意味著它允許定義輸入引數,並且花括號內部也支援填寫業務邏輯程式碼。假如重新定義一個橘子類OrangeConstruct,同時編寫帶有輸入引數的構造方法,且輸入引數為產地欄位,則該類的構造方法應當書寫如下:

	// 只有一個輸入引數的構造方法
	public OrangeConstruct(String inputPlace) {
		place = inputPlace;
		if (place.equals("淮北")) {
			name = "枳子";
		} else {
			name = "橘子";
		}
	}

 

如果需要其它的輸入引數,也可定義輸入引數各異的另一個構造方法,就像普通方法的過載操作那樣。例如再定義一個擁有三個輸入引數的構造方法,在方法內部對成員屬性加以賦值,此時新構造方法的實現程式碼如下所示:

	// 擁有三個輸入引數的構造方法
	public OrangeConstruct(String inputPlace, double inputWeight, boolean inputRipe) {
		place = inputPlace;
		if (place.equals("淮北")) {
			name = "枳子";
		} else {
			name = "橘子";
		}
		weight = inputWeight;
		isRipe = inputRipe;
	}

 

對於輸入引數非空的構造方法,外部呼叫的時候,同樣把引數欄位依次填寫即可,具體的呼叫程式碼示例如下:

	// 演示OrangeConstruct類的呼叫
	private static void testConstruct() {
		// 建立OrangeConstruct的一個例項
		OrangeConstruct orange = new OrangeConstruct("淮北", 100, false);
		// 列印該例項的詳細資訊
		System.out.println(orange.toString());
	}

 

需要注意的是,一旦定義了帶輸入引數的構造方法,Java在編譯之時就不會自動補上預設的構造方法。此時若想繼續使用預設的構造方法,就得在類定義中寫明不帶引數的構造方法。

更多Java技術文章參見《Java開發筆記(序)章節目錄

相關文章