[Java] 7.1. 建構式

一種特殊的方法,只用來建立物件的方法。

 

image/svg+xml7.1. 建構式 - Constructor class Person { String id; String name; String gender; int age; } class MainClass{ public static void main( String [] args){ Person p; p = new Person () ; } } 編譯時發⽣錯誤 MainClass.java:6: error: '(' or '[' expected p = new Person; ^ 1 error class Person { String id; String name; String gender; int age; Person() { } } class MainClass{ public static void main( String [] args){ Person p; p = new Person() ; System.out.println(p); } } class Person { String id; String name; String gender; int age; } class MainClass{ public static void main( String [] args){ Person p; p = new Person() ; System.out.println(p); } } class Person { String id ; String name ; String gender ; int age ; Person ( String pID , String pName , String pGender , int pAge ){ id = pID ; name = pName ; gender = pGender ; age = pAge ; } } class MainClass{ public static void main( String [] args){ Person p; p = new Person ( " K12345678 " , " Jack " , " 男⽣ " , 20 ); System.out.println( p.id ); System.out.println( p.name ); System.out.println( p.gender ); System.out.println( p.age ); } } class Person { String id; String name; String gender; int age; Person ( String pID , String pName ) { id=pID; name=pName; } Person ( String pID , String pName , String pGender , int pAge ) { id=pID; name=pName; gender=pGender; age=pAge; } } class MainClass{ public static void main( String [] args){ Person p2; p2 = new Person ( " K11122333 " , " Sala " ); System.out.println(p2. id ); System.out.println(p2. name ); System.out.println(p2. gender ); System.out.println(p2. age ); Person p3; p3 = new Person ( " K12345678 " , " Jack " , " 男⽣ " , 20 ); System.out.println(p3. id ); System.out.println(p3. name ); System.out.println(p3. gender ); System.out.println(p3. age ); } } 執⾏結果 K111222333 Sala null 0 K12345678 Jack 男⽣ 20 class Person { String id; String name; String gender; int age; Person ( String pID , String pName ) { id=pID; name=pName; } Person ( String pID , String pName , String pGender , int pAge ){ id=pID; name=pName; gender=pGender; age=pAge; } } class MainClass{ public static void main( String [] args){ Person p; p = new Person (); } } 編譯時發⽣錯誤 MainClass.java:4: error: no suitable constructor found for Person(no arguments) p = new Person(); ^ constructor Person.Person(String,String) is not applicable (actual and formal argument lists differ in length) constructor Person.Person(String,String,String,int) is not applicable (actual and formal argument lists differ in leng th) 1 error J7_1_1 – Person.java 1. 這是⼈員類別( Person )。 J7_1_2 – Person.java 2. 透過 new 建立⼈員物件( Person ),但類別後⽅的⼩括號 (()) 是什麼?不加上⼜不能編誤,那它到底是什麼? J7_1_1 – MainClass.java 1. 這是⼈員類別( Person )。 3. 建構式的名稱與類別同名稱是相同的。另外 它也有⼩括號( ( ) )與程式區塊( { } )。 J7_1_2 – MainClass.java 2. 這是⼀個建構式。 3. 建構式的名稱與類別同名稱是相同的。另外 它也有⼩括號( ( ) )與程式區塊( { } )。 J8_1_3 – Person.java J8_1_3 – MainClass.java Person() { } 1. 這是⼈員類別( Person )。 2. 這個就是預設建構式,它沒有任何參數。當類別沒有 任何建構式時,編譯器也會為您加上這個預設的建構式。 3. 這也就是為什麼我們只要宣告了⼀個⼈員類 別,在沒有給它任何的建構式的情況下,也能以 “new Person()” 建立⼈員物件的原因。 J7_1_4 – Person.java J7_1_4 – MainClass.java 1. 這是⼈員類別( Person )。 2. 為建構式加上參數,加上參數的⽅式與⽅法相同,每個 參數皆要有型別,且參數間皆以逗號( , )分隔。在這個建 構式中,我們準備了與⼈員類別上的屬性相對應的參數。 3. 透過參數代入的 資料轉存於屬性中。 4. 現在,我們可以直接在⼈員建構式上,透過參數的⽅式 將⼈員的資料代入⾄物件中,以進⾏初始化物件的動作。 5. ⽽這些屬性中的資料已經由建構式中代入了, 因此可以從這些屬性中取得建構式代入的資料。 J7_1_5 – Person.java 1. 這是⼈員類別( Person )。 2. ⼆個不同參數個數的建構 式,這是都是可以透過多載的技 術同時存在於⼈員類別中的。 J7_1_5 – MainClass.java 3. 在建立物件時,因多載的關係,因此可透 過參數選⽤不同的建構式來建立員⼯物件。 4. 這是 “Person(String, String)” 建構式建立 的物件,因僅代入⾝份證字號( id )與姓名( name 資料進⾏初始化,其餘的性別( gender )與年齡 age )將會是預設值 null 0 5. 這是另⼀個多載建構式 “Person(String, String, String, int)” 所建立的物件,其會於 建構式參數代入 4 個資訊,因此⼈員的⾝份證字號、 姓名、性別與年齡皆會於建立物件時設定初始值。 J7_1_6 – Person.java J7_1_6 – MainClass.java 1. 這是⼈員類別( Person )。 Person() { } 2. ⼈員類別提供了兩個⾃訂的建構式。 3. 這時編譯器發現已有兩個⾃訂的建構式, 因此不會在加上⼀個沒有參數的預設建構式。 4. 這時使⽤沒有參數的預設建構式來建立⼈員物件時,就會發⽣ 發不到這個預設建構式- Person() 的情況,原因是當類別中有 ⾃訂的建構式時,這時編譯器就不會為這個類別加上預設的建構 式,因此才會有找不到預設建構式- Person() 的錯誤產⽣。 為什麼 "new Person()" 可以建立⼈員物件? 不要 Person 後⾯的⼩括號( () )⾏嗎? new+ 建構式,建立⼈員物件 預設建構式, 編譯器為無建構式的⼈員類別捕上 參數,為建構式代入⼈員資料 多載的建構式,提供多種建立⼈員物件的⽅式 注意,編譯器僅為無任何建構式的類別安插預設建構式 1 1 1 2 1 2 1 1

留言