前面介紹瞭如何定義一個簡單的類,以及它的成員屬性和成員方法,從示例代碼可以看到,不管是OrangeSimple還是OrangeMember,都要先利用關鍵字new創建一個實例,然後才能通過實例名稱訪問成員屬性和成員方法。不知道大家有沒有註意到,new後面的類名跟著一副圓括弧,就像下麵代碼這樣: 可圓 ...
前面介紹瞭如何定義一個簡單的類,以及它的成員屬性和成員方法,從示例代碼可以看到,不管是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開發筆記(序)章節目錄》