[Java] 4.7. 靜態化

靜態化,讓屬性或方法只存在一份於類別上。

 

image/svg+xml4.7. 靜態化 - static static ,也可讓移⺠⽅法僅存在⼀份 類別可直接存取靜態的屬性與⽅法 透過物件存取靜態的屬性與⽅法時, 編譯器會將物件轉換為類別後進⾏存取 注意,靜態⽅法不可以存取 非靜態化的屬性與⽅法 class Person { String id, name; int age; String planet ; } class Main{ public static void main( String [] args){ Person p1 = new Person (); Person p2 = new Person (); p1 . planet = " 地球 " ; p2 . planet = " 地球 " ; p1 . planet = " 火星 " ; p2 . planet = " 火星 " ; } } class Person { String id, name; int age; static String planet ; } class Main{ public static void main( String [] args){ Person p1 = new Person (); Person p2 = new Person (); p1 . planet = " 地球 " ; System.out.println( p1 . planet ); System.out.println( p2 . planet ); } } 執⾏結果 地球 地球 class Person { String id, name; int age; static String planet ; static void immigrate ( String newPlanet ){ planet = newPlanet ; } } class Main{ public static void main( String [] args){ Person p1 = new Person(); p1 . planet = " 地球 " ; Person p2= new Person(); p2 . immigrate ( " 火星 " ); System.out.println( p1 . planet ); System.out.println( p2 . planet ); } } class Main{ public static void main( String [] args){ Person . planet = " 地球 " ; System.out.println( Person . planet ); Person . planet = " 火星 " ; Person p1 = new Person (); Person p2 = new Person (); System.out.println( p1 . planet ); System.out.println( p2 . planet ); Person . immigrate ( " ⽔星 " ); System.out.println(p1.planet); System.out.println(p2.planet); } } 執⾏結果 地球 火星 火星 ⽔星 ⽔星 class Main{ public static void main( String [] args){ Person . planet = " 地球 " ; Person p1 = new Person (); Person p2 = new Person (); p2 . immigrate ( " 火星 " ); System.out.println( p1 . planet ); System.out.println( p2 . planet ); } } class Person { String id , name ; int age ; void show (){ System.out.println(id); System.out.println(name); System.out.println(age); } static void getPersonInfo (){ System.out.println( id ); System.out.println( name ); System.out.println( age ); show (); } } 編譯時發⽣錯誤 Person.java:12: error: non-static variable id cannot be referenced from a static context System.out.println(id); ^ Person.java:13: error: non-static variable name cannot be referenced from a static context System.out.println(name); ^ Person.java:14: error: non-static variable age cannot be referenced from a static context System.out.println(age); ^ Person.java:15: error: non-static method show() cannot be referenced from a static context show(); ^ 4 errors J4_7_1 – Person.java 1. 這是⼈員類別( Person )。 J4_7_2 – Person.java J4_7_1 – Main.java 1. 這是⼈員類別( Person )。 2. 星球屬性( planet )⽤來表⽰⼈員居住的星球。 3. 分別建立 2 個⼈員物件,表⽰分別獨立的⼈員個體。 4. 因為每個⼈員物件皆擁有各⾃的星球屬性 (planet) ,即 使所有的⼈員都是居住在地球上,但還是必須⼀個⼀個指定。 5. 今天地球環境出了問題,所有⼈員將星球屬性所成火星,但⼜因 為星球屬性是依附在每個⼈員物件上的,因此⼜要⼀個⼀個進⾏修 改。有沒有辦法可以讓所有物件共⽤同⼀個屬性呢?這樣在某⼈員 改變居住星球的時候,可以⼀次即變更所有⼈員居住的星球。 J4_7_2 – Main.java 2. 使⽤ static 將居住星球屬性( planet )靜態化,如此這個居住星球屬性就會只存在 ⼀份於類別上,不論建立多少個⼈員物件,這個居住星球屬性也只會存在⼀份。 3. 雖然分別使⽤ new 建立 2 個獨立的⼈員物件。 4. 並只透過存在於 p1 變數的⼈員物件 來設定居住星球屬性的值為地球。 5. 因為居住星球以使⽤ static 進⾏靜態化,因此居住星球屬性只會存在⼀ 份,不論是透過 p1 變數中的⼈員物件,或是 p2 變數的⼈員物件取得的居住星 球屬性中的資料都會是地球。原因為它們共同使⽤了存在於⼈員類別上的星球 屬性,即便只有 p1 變數中的⼈員設定了居住星球屬性也是⼀樣。 J4_7_3 – Person.java 1. 這是⼈員類別( Person )。 2. 使⽤ static 關鍵字將移⺠⽅法( immigrate )靜態化, 如此這個移⺠⽅法就會只存在⼀份於類別上,不論建立多少個 ⼈員物件,這個移⺠⽅法也只會存在⼀份。 3. 透過移⺠⽅法代入的參數改變居住星球屬性的資料。 J4_7_3 – Main.java 5. 透過 p2 變數的⼈員物件透過移⺠⽅法( immigrate() )改變居住星球的屬性值。因為居住 星球屬性是共⽤的,因此當使⽤移⺠⽅法進⾏移⺠時,這時所有的⼈員都將移⺠⾄火星。 4. 透過存在於 p1 變數的⼈員物件來設定居住星球屬性的值為地球。 6. 不論是透過 p1 變數中的⼈員物件,或是 p2 變數的⼈員物件取得的居住星球屬 性中的資料都會是火星,原因為它們共同使⽤了存在於⼈員類別上的星球屬性。 J4_7_4 – Main.java 1. 靜態的屬性與⽅法其實是直接存在於類別上的,因此可直接透過⼈ 員類別( Person )來設定居住星球屬性( planet )的值為地球。 3. 再透過⼈員類別來設定居住星球屬性的值為火星。 2. 當然,再次存取居住星球屬性時,其值會是地球。 4. 在此雖然建立 2 個⼈員物件,並取居住星球屬性的值,但最後取得的值也會是火 星,原因是居住星球屬性是存在於類別上的,物件也是共甸這個類別上的星球屬性。 5. 同樣的,⼈員類別也可直接呼叫移⺠⽅法 immigrate() ),將星球屬性間接設定為⽔星。 J4_7_5 – Main.java 1. 您可以直接透過⼈員類別( Person )來 設定居住星球屬性( plant )的值為地球。 2. 在此建立 2 個⼈員物件。 1. 這是⼈員類別( Person ),其中的⾝份證字號( id )、姓名( name )、年齡 age )屬性與⾃我介紹⽅法( show() )皆未使⽤ static 進⾏靜態化,這意味著 這些屬性與⽅法是相依在物件上的,必須先透過 new 建立物件後才可使⽤。 Person . immigrate (“ 火星 ”); Person . planet Person . planet 3. 雖然這時以⼈員物件的⽅式存取靜態的屬性與⽅法,但最後編譯器 皆會它轉換為⼈員類別( Person )的⽅式來執⾏。所以不論我們使⽤ 哪⼀個⼈員物件,得到的結果皆是相同的,其原因就是出在這。 4. 被換成 5. 被換成 6. 被換成 J4_7_6 – Person.java 3. 注意,靜態的⽅式是不可以存取非靜態的屬性與⽅法的。原因很 簡單,非靜態的屬性與⽅法是依附在物件上的,⽽在未使⽤ new 建立 物件之前,物件是不存在的,所以無法存取;再者,物件是獨立的, ⽽類別只有⼀個,若依附在類別上的靜態⽅法可以存取物件上的屬性 與⽅法,那它存取到的到底是哪⼀個物件的屬性與⽅法呢?! 2. 這是⼀個隨意製作的靜態⽅法, 希望能取得 ⼈員物件 上的資料。 static ,讓居住星球屬性只存在⼀份 1 2 1 2 1 2 3 4 5 1 2 3 2 3 所有⼈員都是居住在地球上的,當地球無法⽣存時, 所有⼈員必須移居火星, Java ⼜要如何表達呢?

留言