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