1. 程式人生 > >匿名類new一個介面產生,匿名類的作用

匿名類new一個介面產生,匿名類的作用

為什麼需要內部類 典型的情況是,內部類繼承自某個類或實現某個介面,內部類的程式碼操作建立其的外圍類的物件。所以你可以認為內部類提供了某種進入其外圍類的視窗。使用內部類最吸引人的原因是: 每個內部類都能獨立地繼承自一個(介面的)實現,所以無論外圍類是否已經繼承了某個(介面的)實現,對於內部類都沒有影響。如果沒有內部類提供的可以繼承多個具體的或抽象的類的能力,一些設計與程式設計問題就很難解決。從這個角度看,內部類使得多重繼承的解決方案變得完整。介面解決了部分問題,而內部類有效地實現了“多重繼承”。

new ActionListener(){} 相當於動態的實現了介面,在記憶體中建立了一個ActionListener物件,

區別就是這個物件的實現類就直接在另一個程式碼中定義了,而不是獨立的檔案。

我們一般稱這種類為匿名類,當然,匿名類不止實現介面這一種。

比如 一個介面 A ,裡面有一個方法fun1(),一般我們是先定義它的實現再引用它,比如

public class ImpA implements A{
 public void fun1(){
    //do some thing...
 }
}

然後在另一個類呼叫

public class Class1 {
 public void method1(){
    A a = new ImpA();
 }
}

但有時我想對這個介面做另一個實現不想使用ImpA,但由於是臨時的又不想去做定義,則你就可以這樣

public class Class1 {
 public void method1(){
    A a = new A(){ //相當於在記憶體中直接產生了一個介面的實現並引用這個記憶體物件。動態的程式碼
       public void fun1(){
         //do some thing...
       }
    };
 }

}

回撥函式中出現的匿名類:

一個函式實現相同功能但更靈活:
首先定一個回撥介面:
java 程式碼

public   class TestObject {   
    /**   
     * 一個用來被測試的方法,進行了一個比較耗時的迴圈   
     */    


    public   static   void testMethod(){   
        for ( int i= 0 ; i< 100000000 ; i++){   

        }   
    }   
}  


然後再寫一個工具類:
java 程式碼
public   class Tools {   
       
    /**   
     * 測試函式使用時間,通過定義CallBack介面的execute方法   
     * @param callBack   
     */    
    public   void testTime(CallBack callBack) {   
        long begin = System.currentTimeMillis(); //測試起始時間    
        callBack.execute(); ///進行回撥操作    
        long end = System.currentTimeMillis(); //測試結束時間    
        System.out.println("[use time]:" + (end - begin)); //列印使用時間    
    }   
       
    public   static   void main(String[] args) {   
        Tools tool = new Tools();   
        tool.testTime(new CallBack(){   
            //定義execute方法    
            public   void execute(){   
                //這裡可以加放一個或多個要測試執行時間的方法    
                TestObject.testMethod();   
            }   
        });   
    }   
}  

匿名內部類的兩種實現方式:第一種,繼承一個類,重寫其方法;第二種,實現一個介面(可以是多個),實現其方法。