1. 程式人生 > >java區域性內部類和匿名內部類的比較

java區域性內部類和匿名內部類的比較

區域性內部類和匿名內部類,具有相同的能力和作用,但區域性內部類的名字在方法外是不可見的。
那麼為什麼我們使用區域性內部類而不是匿名內部類呢?
* 唯一理由是:我們需要一個命名的構造器或者需要過載構造器,而匿名內部類只能用於例項初始化.
* 另一個理由:需要不止一個該內部類的物件.
程式碼測試:
interface Counter{
    int next();
}

public class LocalInnerClass {
    private int count=0;
    Counter getCounter(final String name){
        //區域性內部類
        class LocalCounter implements Counter{
            public LocalCounter(){
                System.out.println("LocalCounter()");
            }
            public int next(){
                System.out.println(name);
                return count++;
            }
        }
        return new LocalCounter();
    }
    Counter getCounter2(final String name){
        return new Counter() {
            @Override
            public int next() {
                System.out.println(name);
                return count++;
            }
            //匿名內部類不能有帶名字的構造器,只能有內容初始化;
            {
                System.out.println("Counter()");
            }
        };
    }

    public static void main(String[] args) {
        LocalInnerClass localInnerClass=new LocalInnerClass();
        Counter
                c1=localInnerClass.getCounter("Local inner"),
                c2=localInnerClass.getCounter2("annomous class");
        for(int i=0;i<7;i++){
            System.out.println(c1.next());
        }
        for(int i=0;i<7;i++){
            System.out.println(c2.next());
        }
    }
}

測試結果
LocalCounter()
Counter()
Local inner
0
Local inner
1
Local inner
2
Local inner
3
Local inner
4
Local inner
5
Local inner
6
annomous class
7
annomous class
8
annomous class
9
annomous class
10
annomous class
11
annomous class
12
annomous class
13