1. 程式人生 > >java匿名內部類詳解

java匿名內部類詳解

【宣告】此文轉載自:http://blog.csdn.net/zhandoushi1982/article/details/8778487

——感謝分享,尊重作者,交流無限!


記得JAVA中抽象類是不能建立例項的,但是在程式碼中總會看見new 抽象類名的用法。如果不太清楚這個原因,需要了解匿名抽象類這個概念。

        匿名類是不能有名稱的類,所以沒辦法引用它們。必須在建立時,作為new語句的一部分來宣告它們。Java中內部匿名類用的最多的地方也許就是在Frame中加入Listener了吧。如下:

  1. import java.awt.*;     
  2. import java.awt.event.*;     
  3. publicclass QFrame extends Frame {     
  4.     public QFrame() {     
  5.            this.setTitle(\"my application\");     
  6.            addWindowListener(new WindowAdapter() {     
  7.                    publicvoid windowClosing(WindowEvent e) {     
  8.                    dispose();     
  9.                    System.exit(0
    );     
  10.                 }     
  11.             });       
  12.           this.setBounds(10,10,200,200);     
  13.      }     
  14. }  

上面的new語句,建立一個 WindowAdapter物件 ,後面一個 {} 表示這個括號中的操作作用於這個預設的物件。開啟 WindowAdapter 的程式碼可以發現,它是一個抽象類。它是對 WindowListener 介面的一個實現。

(1)怎樣判斷一個匿名類的存在?

 先看段虛擬碼
abstract class Father(){
      ....
}
public class Test{
      Father f1 = new Father(){ .... }; //這裡就是有個匿名內部類
}

        一般來說,new 一個物件時小括號後應該是分號,也就是new出物件該語句就結束了。但是出現匿名內部類就不一樣,小括號後跟的是大括號,大括號中是該new 出物件的具體的實現方法。因為我們知道,一個抽象類是不能直接new 的,必須先有實現類了我們才能new出它的實現類。上面的虛擬碼就是表示new 的是Father的實現類,這個實現類是個匿名內部類。其實拆分上面的匿名內部類可為:
class SonOne extends Father{
       ...//這裡的程式碼和上面匿名內部類,大括號中的程式碼是一樣的
}
public class Test{
       Father f1 = new SonOne() ;
}

(2)匿名內部類的注意事項

     A,匿名內部類不能有構造方法。

     B,匿名內部類不能定義任何靜態成員、方法和類。

     C,匿名內部類不能是public,protected,private,static。 

     D,只能建立匿名內部類的一個例項。

     E,一個匿名內部類一定是在new的後面,用其隱含實現一個介面或實現一個類。  
     F,因匿名內部類為區域性內部類,所以區域性內部類的所有限制都對其生效。

     G,匿名類和內部類中的中的this:有時候,我們會用到一些內部類和匿名類。當在匿名類中用this時,這個this則指的是匿名類或內部類本身。這時如果我們要使用外部類的方法和變數的話,則應該加上外部類的類名。

(3)匿名內部類例項,在安卓中,典型的也是各種Listener,比如按鍵的監聽

  1. Button button_stop = (Button) findViewById(R.id.button2);  
  2.         button_stop.setOnClickListener(new Button.OnClickListener(){  
  3.             publicvoid onClick(View v){  
  4.                             stopService(new Intent("org.allin.android.facedetcting2"));      
  5.                 }  
  6.             });