前面介紹瞭如何定義一個簡單的類,以及它的成員屬性和成員方法,從示例程式碼可以看到,不管是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開發筆記(序)章節目錄》