前面提到过,可以在代码块里面创建内部类,典型的方式是在一个方法体的里面创建。局
部内部类不能有访问说明符,因为它不是外围类的一部分,但是它可以访问当前代码块内
的常量,和此外围类所有的成员。下面的例子是对局部内部类与匿名内部类的创建作比较。
//:c08:LocalInnerClass.java
// Holds asequence of Objects.
import com.bruceeckel.simpletest.*;
interface Counter {
int next();
}
public class LocalInnerClass {
private static Test monitor = new Test();
private int count = 0;
Counter getCounter(final String name) {
// A localinner class:
class LocalCounter implements Counter {
public LocalCounter() {
// Local innerclass can have a constructor
System.out.println("LocalCounter()");
}
public int next() {
System.out.print(name); // Access local final
return count++;
}
}
return new LocalCounter();
}
// The samething with an anonymous inner class:
Counter getCounter2(final String name) {
return new Counter() {
// Anonymousinner class cannot have a named
// constructor,only an instance initializer:
{
System.out.println("Counter()");
}
public int next() {
System.out.print(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++)
System.out.println(c1.next());
for(int i = 0; i < 5; i++)
System.out.println(c2.next());
monitor.expect(new String[] {
"LocalCounter()",
"Counter()",
"Localinner 0",
"Localinner 1",
"Localinner 2",
"Localinner 3",
"Localinner 4",
"Anonymousinner 5",
"Anonymousinner 6",
"Anonymousinner 7",
"Anonymousinner 8",
"Anonymousinner 9"
});
}
} ///:~
Counter 返回的是序列中的下一个值。我们分别使用局部内部类和匿名内部类实现了这个
功能,它们有一样的行为和能力。既然局部内部类的名字在方法外是不可见的,那为什么
我们仍然使用局部内部类而不是匿名类呢?唯一理由是,你需要一个已命名的构造器,或
者需要重载构造器,而匿名类只能用于实例初始化。
所以使用局部内部类而不使用匿名内部类唯一的原因就是,你需要不止一个此内部类的对
象。