局部內部類和匿名內部類的對比


創建內部類的典型的方式是在一個方法體的里面創建,局部內部類不能有訪問說明符,因為它不是外圍類的一部分,但是它可以訪問當前代碼塊內的常量,以及此外圍類的所有成員。下面的例子對局部內部類與匿名內部類的創建進行了比較。

具體代碼實現:

package thinking.in.java.demo;

//定義一個接口
interface Counter {
    int next();
}

// 主類LocalInnerClass
public class LocalInnerClass {
    // 定義一個計數標記count;
    private int count = 0;

    // 使用局部內部類
    Counter getCounter(final String name) {
        class LocalCounter implements Counter {
            public LocalCounter() {
                System.out.println("LocalCount()");
            }

            public int next() {
                System.out.print(name+":");
                return count++;
            }
        }
        // 局部內部類和匿名內部類最大的不同之處:局部內部類可以返回不止一個內部類的對象
        // 與下面的匿名內部類的代碼形成鮮明對比
        return new LocalCounter();
    }

    // 使用匿名內部類
    Counter getCounter2(final String name) {
        return new Counter() {
            {
                System.out.println("Counter");
            }

            @Override
            public int next() {
                System.out.print(name+":");
                return count++;
            }
        };
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        LocalInnerClass lic = new LocalInnerClass();
        // 局部內部類
        Counter c1 = lic.getCounter("Local inner");
        // 匿名內部類
        Counter c2 = lic.getCounter2("Anonymous inner");
        for (int i = 0; i < 5; i++) {
            System.out.println(c1.next());
        }
        for (int j = 0; j < 5; j++) {
            System.out.println(c2.next());
        }
    }

}

運行結果:

LocalCount()
Counter
Local inner:0
Local inner:1
Local inner:2
Local inner:3
Local inner:4
Anonymous inner:5
Anonymous inner:6
Anonymous inner:7
Anonymous inner:8
Anonymous inner:9

在代碼中,Counter返回的是序列中的下一個值。我們分別使用局部內部類和匿名內部類是實現了這個功能,它們具有相同的行為和方法。既然局部內部類的名字在方法外是不可見的,那為什么我們仍然使用局部內部類而不是匿名內部類呢?唯一的理由是:我們需要一個已經命名的構造器,或者需要重載構造器,而匿名內部類只能用於實例的初始化,所以使用局部內部類而不使用匿名內部類的另一個理由是,需要不止一個內部類對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM