[Java] 7.4. 初始化區塊

初始化區塊,在建構式之前用來初始化物件的區塊。

 

image/svg+xml初始區塊,必定於建構式之前被呼叫 靜態初始化區塊,初始化⼈員類別的靜態屬性 初始化區塊,為⼈員屬性加上預設值 7.4. 初始化區塊 – Initial Block class Person { String id ; String name ; String gender ; int age ; Person (){ } } class MainClass{ public static void main( String [] args){ Person p = new Person (); System.out.println( p.id ); System.out.println( p.name ); System.out.println( p.gender ); System.out.println( p.age ); } } 執⾏結果 null null null 0 class Person { String id; String name; String gender; int age; { age= 1 ; } } class MainClass{ public static void main( String [] args){ Person p = new Person (); System.out.println( p.id ); System.out.println( p.name ); System.out.println( p.gender ); System.out.println( p.age ); } } 執⾏結果 null null null 1 class Person { String id; String name; String gender; int age; { age= 1 ; } Person ( String id , String name ){ this .id = id; this .name = name; } } class MainClass{ public static void main( String [] args){ Person p; p = new Person ( " k12345678 " , " Jack " ); System.out.println( p.id ); System.out.println( p.name ); System.out.println(p.gender); System.out.println(p.age); } } 執⾏結果 k12345678 Jack 1 class Person { String id, name, gender; int age; static String planet ; static { planet = " 地球 " ; } } class MainClass{ public static void main( String [] args){ Person p = null ; System.out.println( Person . planet ); } } 執⾏結果 地球 J7_4_1 – Person.java 7. 年齡( age )屬性會是 1 ,這是由 我們⾃訂的初使化區塊所設定的。 J7_4_2 – Person.java J7_4_1 – MainClass.java 1. 這是⼈員類別( Person )。 2. 注意,在此提供的預設建構式,並未對⾝份證 字號( id )、姓名( name )、性別( gender )與 年齡( age )作任何指派值的動作。 3. 透過預設建構式建立⼈員物件( Person )。 4. 為什麼在⼈員物件上列印出來的屬 性會有資料呢?不是從來未指派值予⼈員的 ⾝份證字號、姓名、性別與年齡屬性嗎? { id=null; name=null; gender=null; age=0; } 1. 這是⼈員類別( Person )。 3. 這是編譯器加上的,它會將所有的屬性依 照型別給予初使值;例如類別型別的初使資料 就是 null int 型別的初使資料就是 0 2. 初始區塊( Initial Block )只有⼀ 對⼤括號,裡⾯裝著要進⾏初化的程式。 5. 建立⼈員物件。 J7_4_2 – MainClass.java 6. 其中的⾝份證字號、姓名與性別 gender )屬性會是 null ,是由編譯器 所給定的初使化區塊所設定的。 J7_4_3 – Person.java { id=null; name=null; gender=null; age=0; } 1. 這是⼈員類別( Person )。 2. 這是編譯器為我們加上的初始區塊。 3. 這是另⼀個初使化區塊,不論是編譯器加 的,或是⾃訂的,皆會在建構式之前執⾏完畢。 4. 此建構式可設定⾝份證字號( id )與姓名屬性( anme 的值,注意,建構式會在所有初使化區塊完成後才執⾏。 J7_4_3 – MainClass.java 6. 其中的⾝份證字號、姓名與性別( gender )屬性會是 null ,是由編譯器所給定的初使化區塊所設定的。 5. 透過建構式傳遞⾝份證號與姓名 2 屬性的值。 J7_4_4 – Person.java static { planet=null; } 1. 這是⼈員類別( Person )。 2. 有個靜態化的屬性 - 星球屬性 planet ),此屬性是依附在類別之上。 3. 這些是靜態初始化區塊( Static Initial Block ),其前⾯都會加 static 的字樣,接著是⼀對⼤括號,裡⾯裝著要進⾏初化的程式。 4. 這是編譯器加上的,在此靜態初始化區塊中,其 會將所有的靜態的屬性依照型別給予初使值;例如在 此的星球屬性即是類別型別,初使資料就是 null 5. 當然也可以⾃訂靜態初使化區塊;但記得,編譯器加上的靜態 初使化區塊是會先執⾏的,然後才是執⾏我們⾃定的初使化區塊。 因此,居住星球( planet )屬性最後會放入 地球 的資料。 J7_4_4 – MainClass.java 1. 當⼈員類別( Person )出現的同時, JVM 就會載入⼈員類別,並執⾏ 靜態的初始區塊以初使化靜態的屬性。⽽ JVM 僅會對相同的類別作 1 次性 的載入動作,這也說明了靜態的初始區塊⾄多也只會被呼叫⼀次。 2. 最後居住星球( planet )屬性中的資料會是 地球 ,這是 在我們⾃訂的靜態初使化區塊中設定的。這也證明⾃訂的靜態初 使化區塊會在編譯器所⾃動建立的靜態初使化區塊後執⾏。 為什麼⼈員物件上的屬性 都會被給予預設的資料? 1 1 1 1 靜態初始化區塊,僅於第 1 次使⽤類別時呼叫 1 1

留言