[Java] 15.3. 匿名類別

匿名類別,一種沒有名字的類別,其他是內隱類別的一種。

 

image/svg+xml15.3. 匿名類別 – Anonymous Class class Contractor1 extends Programmer { void code (){ System.out.println( " 開始寫程式 " ); System.out.println( " 寫程式完成 " ); } void debug (){ System.out.println( " 我是第⼀類別派遣⼈員,我只寫程式,不作除錯 " ); } } class Contractor2 extends Programmer { void code (){ System.out.println( " 我是第⼆類別派遣⼈員,我不寫程式,只作除錯 " ); } void debug (){ System.out.println( " 開始除錯 " ); System.out.println( " 除錯完成 " ); } } class Main{ public static void main( String [] args){ Programmer p ; p = new Programmer ( "K12345678" , "Jack" , " , 20 , "048679" , 40000 ) { } ; System.out.println( 員⼯: " + p.name ); p.code (); p.debug (); } } class Main{ public static void main( String [] args){ Programmer p; p = new Programmer ( "K12345678" , "Jack" , " , 20 , "048679" , 40000 ) { int count ; public void code (){ super .code (); count ++; System.out.println( " 這是我第 " + count + " 次進⾏寫程式的⼯作。 " ); } } ; p.code (); p.code (); } } class Main{ public static void main( String [] args){ Programmable p; p = new Programmable () { int codeCount ; int debugCount ; public void code (){ System.out.println( " 派遣⼈員 Jack" ); codeCount++; System.out.println( " 進⾏第 " + codeCount + " 次寫程式的⼯作。 " ); } public void debug (){ System.out.println( " 派遣⼈員 Jack" ); debugCount++; System.out.println( " 進⾏第 " + debugCount + " 次除錯的⼯作。 " ); } } ; p.code (); p.debug (); } } class Boss { void codeCommad ( Programmable p ){ p.code(); } } class Main{ public static void main( String [] args){ Boss b = new Boss (); b.codeCommad ( new Programmable () { int codeCount, debugCount; public void code(){ System.out.println( " 派遣⼈員 Jack" ); codeCount++; System.out.println( " 進⾏第 " + codeCount + " 次寫程式的⼯作。 " ); } public void debug(){ System.out.println( " 派遣⼈員 Jack" ); debugCount++; System.out.println( " 進⾏第 " + debugCount + " 次除錯的⼯作。 " ); } } ) ; } } J15_3_1 Contractor1.java 1. 只寫程式不除錯的派遣⼈員 1 Contractor1 )。 J15_3_2 Main.java J15_3_1 Contractor2.java 2. 改寫撰寫程式⽅法( code() ),讓派遣⼈員 1 有寫程式的能⼒。 3. 改寫除錯⽅法( debug() ),讓派遣⼈員 1 不具有除錯的能⼒。 4. 為了建立⼀個只除錯不寫程式的派遣⼈員, ⼜另外建立⼀派遣⼈員 2 Contractor2 )。 5. 改寫撰寫程式⽅法( code() ),讓派遣⼈員 2 不具有寫程式的能⼒。 6. 改寫除錯⽅法( debug() ),讓派遣⼈員 2 具有除錯的能⼒。 注意,現在員⼯類別並不是公司類別的內隱類別了,⽬的只是為了簡化範例⽽ 已。 1. 宣告⼀個程式設計師( Programmer )變數 p 2. 當在建構式後⾯加上⼤括號( { } )時,代表著要建立⼀ 個匿名類別,並繼承⾃程式設計師( Programmer )類別。 3. 程式設計師類別的建構式還是可以使⽤的,特別的是這個 建構式並不是匿名類別的建構式(匿名類別沒有類別名稱,因 此也無法擁有建構式),⽽是⽗類別-程式設計師的建構式。 4. 因為建立的是繼承⾃程式設計⼈ 員類別的物件(只是這個類別沒有 名字),所以可以⾃動轉型為程式 設計⼈員的型別,並放入 p 變數中。 5. 不論是屬性或⽅法都是可以從程式設計⼈ 員類別中繼承下來的,因此可以使⽤。 到⽬前為⽌,匿名類別宣告與物件的建立好像與⼀般建立物件的過程很像,只 是多了⼀個⼤括號⽽已( { } ),感覺不出來有個匿名類別被定義出來,並且 建立此匿名類別的物件。⽽匿名類別的類別檔命名⽅式,將如何內隱類別的命 名⽅式,因此匿名類別也屬於內隱類別的⼀種。 J15_3_3 Main.java 1. 建立繼承⾃程式設計師( Programmer )的匿名物件。 3. 這是為匿名類別加上的次數屬性( count )。 4. 這是改寫的動作,改寫⾃程式⼈員 類別繼承下來的撰寫程式⽅法。 2. 匿名類別的 ⼤括號( { } 其實就是⼀般類 別的⼤括號,是 ⽤來規範類別應 該什麼屬性與⽅ 法等的成員的。 5. 透過 super 叫⽤⽗類別的撰寫程式的⽅ 法。恩,不要忘了匿名類別都是由繼承⽽來 的,只是它沒有類別名稱⽽已。 6. 這是匿名類別所定義的次數屬性 count ),⽤來計算此撰寫程式的次數。 7. 別忘了加上分號( ; ),因為這是⼀個建立匿名類別的物件語⾔,所以要⽤分號作結束。 8. 這會呼叫匿名類別改寫過後的撰寫程式⽅法。所以會出現撰寫次數的⽅法。 J15_3_4 Main.java 1. 這是可程式設計介⾯( Programmable ),並不 是⼀個類別,但也可以建立實作可程式設計介⾯的匿 名類別,並直接透過 new 建立匿名類別的物件。 2. 這是為匿名類別加上的撰寫程式次數屬性 codeCount )與除錯次數屬性( debugCount )。 3. 這是改寫可程式設計介⾯的撰寫程式⽅法( code() )。 4. 這是改寫可程式設計介⾯的除錯⽅法( debug() )。 . 不要忘了加上分號( ; )。 6. 這會呼叫匿名類別改寫過後的撰寫程式與除錯⽅法。 J15_3_5 Boss.java J15_3_5 Main.java 1. 老闆( Boss )的寫程式命令⽅法( codeCommad() ),只要是 實作可程式化介⾯( Programmable )的物件即可代入此參數中。 2. 建立老闆物件。 3. 呼叫撰寫程式命令⽅法時( codeCommand() ),直接 建立實作可程式化介⾯( Programmable )的匿名物件, 並在建立後代入⾄撰寫程式命令⽅法中以作為參數。 4. 因為建立的匿名類別物件是直接放入參數中的,因此沒 有所謂結束陳述句( statement )的分號。陳述句的結束 是應由寫程式命令⽅法( codeCommad() )來完成。 5. 注意,注是老闆( Boss )物件的寫程式命令⽅法 codeCommad() )的結束分號,⽽不是建立匿名類別的分號。 公司請了派遣⼈員, 但派遣⼈員的⼯作的內容是會變動的! 1 步,匿名類別讓派遣⼈員可以繼承任何⾓⾊ 2 步,以匿名類別定義的派遣⼈員, 可以透過改寫來變更⽅法的⾏為 依照程式設計能⼒介⾯聘請派遣⼈員 匿名類別也可以寫在參數列中

留言