可以在代碼塊里創建內部類,典型的方法是在一個方法體的里面創建,局部內部類不能有訪問說明符,因為它不是外圍類的一部分,但是可以訪問當前代碼塊的常量,以及此外圍類的所有成員,下面分別對局部內部類和匿名內部類進行了比較
//: innerclasses/LocalInnerClass.java // Holds a sequence of Objects. package object; import static net.util.Print.*; interface Counter { int next(); } public class LocalInnerClass { private int count = 0; Counter getCounter(final String name) { // A local inner class: class LocalCounter implements Counter { //局部內部類 public LocalCounter() { // Local inner class can have a constructor print("LocalCounter()"); } public int next() { printnb(name); // Access local final return count++; } } return new LocalCounter(); } // The same thing with an anonymous inner class: Counter getCounter2(final String name) { return new Counter() { //匿名內部類 // Anonymous inner class cannot have a named // constructor, only an instance initializer: { print("Counter()"); } public int next() { printnb(name); // Access local final return count++; } }; } public static void main(String[] args) { LocalInnerClass lic = new LocalInnerClass(); Counter c1 = lic.getCounter("Local inner "), c2 = lic.getCounter2("Anonymous inner "); for(int i = 0; i < 5; i++) print(c1.next()); for(int i = 0; i < 5; i++) print(c2.next()); } } /* Output: LocalCounter() 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 *///:~
局部內部類和匿名內部類都實現了這個功能, 它么具有相同的行為和能力,既然局部內部類的名字在方法外是不可見的,那為什么還要使用基本內部類呢,唯一的理由是我們需要一個已命名的構造器,或需要重構構造器,而匿名構造器只能用於實例初始化
另外一個理由是,我們需要不止一個該內部類的對象
