創建內部類的典型的方式是在一個方法體的里面創建,局部內部類不能有訪問說明符,因為它不是外圍類的一部分,但是它可以訪問當前代碼塊內的常量,以及此外圍類的所有成員。下面的例子對局部內部類與匿名內部類的創建進行了比較。
具體代碼實現:
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返回的是序列中的下一個值。我們分別使用局部內部類和匿名內部類是實現了這個功能,它們具有相同的行為和方法。既然局部內部類的名字在方法外是不可見的,那為什么我們仍然使用局部內部類而不是匿名內部類呢?唯一的理由是:我們需要一個已經命名的構造器,或者需要重載構造器,而匿名內部類只能用於實例的初始化,所以使用局部內部類而不使用匿名內部類的另一個理由是,需要不止一個內部類對象。