[Java] 15.2. 靜態巢狀類別

類別中的類別也可以是靜態的。

 

image/svg+xml15.2. 靜態巢狀類別 Static Nested Class class Company { String name; private int cash= 10000 ; static class BestCompanys { static Company first ; static Company second ; } Employee createEmployee(){ return new Employee(); } class Employee extends Person{ String employeeID; int salary; void buy( Product p){ cash = cash - p.price; System.out.println( " ⽬前公司的現⾦為 " + cash); } void IntroduceCompany(){ System.out.println( " 員⼯ " + this .name + ⼯作於 " ); System.out.println(Company.this.name); System.out.println( " 零⽤⾦還有 " + Company.this.cash); } } } class Main{ public static void main( String [] args){ Company com1 = new Company (); com1.name = "Java 股份有限公司 " ; Company com2 = new Company (); com2.name = "VB 股份有限公司 " ; Company.BestCompanys b1 = new Company.BestCompanys (); b1 . first = com1 ; b1 . second = com2 ; Company.BestCompanys b2 = new Company.BestCompanys (); System.out.println( b2.first .name); System.out.println( b2.second .name); } } 執⾏結果 Java 股份有限公司 VB 股份有限公司 class Company { String name; private int cash= 10000 ; static String purpose = " 成立公司的⽬的是為了賺錢 " ; static class BestCompanys { static Company first; static Company second; static void Reason (){ System.out.println( " 最好的公司的定義,就是將公司的⽬的 " + purpose + "’ 作到最好 " ); } } // 略過⼀些程式 } class Company { String name; static String purpose = " 成立公司的⽬的是為了賺錢 " ; private int cash = 10000 ; static class BestCompanys { static Company first; static Company second; // 略過⼀些程式 static void tryToGetCash (){ System.out.println( cash ); } } // 略過⼀些程式 } 執⾏結果 Company.java:17: error: non-static variable cash cannot be referenced from a static context System.out.println(cash); ^ 1 error J15_2_1 Company.java 1. 這是公司類別( Company )。 J15_2_1 Main.java 2. 這就是傑出公司排⾏榜類別( BestCompanys ),其使⽤ static 進⾏靜態化,因此只會有⼀個傑出公司排⾏榜同時存在。 3. 加入 2 個靜態的屬性,以存放前 2 名的傑出公司。 1. 刻意建立 2 個公司物件( Company ), 分別放入 com1 com2 變數中。 2. 特別的是傑出公司排⾏榜類別( BestCompanys )是靜態類別,但也必須使⽤ new 來取得 傑出公司排⾏榜類別的物件實體,⽽傑出公司排⾏榜類別是位於公司類別( Company )中的, 因此要以 “Company.BestComapnys” 的⽅式指出公司排⾏榜類別是⼀個巢狀類別。 3. 透過第 1 個取得的傑出公司排⾏榜物件實體,設定 第1名與第 2 名的公司⾄ first second 屬性中。 4. 不論使⽤ new 關鍵字取得公司排⾏榜類別 BestCompanys )多少次,都會取得相同的物件實體。 5. 因為取得是同⼀個公司排⾏榜類別的實體物件, first second 屬性皆已被設定 過,因此可以取得存放在 first second 屬性中的公司物件,並將其名稱列印出來。 J15_2_2 Company.java 1. 這是公司類別( Company )。 . 定義⼀個靜態化的⽬的屬性( purpose )於公司類別中。 . 這就是內隱且靜態( static )的傑 出公司排⾏榜類別( BestCompanys )。 5. 靜態的巢狀類別 - 傑出公司排⾏榜類別,可 以直接存取外部類別 - 公司類別的靜態屬性。 4. 同時傑出公司排⾏榜類別有個靜態化 的取得理由⽅法( Reason() )。 當然,靜態化的內隱類別也是可以存取外部類別的靜態化⽅法。 J15_2_3 Company.java 1. 這是公司類別( Company )。 . 有個非靜態化的零⽤⾦屬性( cash )。 . 這就是內隱且靜態( static )的傑 出公司排⾏榜類別( BestCompanys )。 . 靜態巢狀類別 - 傑出公司排⾏榜類別,無法存取 非靜態的屬性(也包括⽅法)。原因是非靜態的屬性 (也包括⽅法)只有在物件建立後才存在。 使⽤靜態巢狀類別製作傑出公司排⾏榜 靜態巢狀類別的傑出公司排⾏榜 是必須使⽤ new 關鍵字來取得的 靜態巢狀類別也可以存取外部類別的靜態成員 靜態巢狀類別不能存取 外部類別的非靜態成員 1 1

留言