您的位置:首页 > 编程语言 > Java开发

Java之局部内部类和匿名内部类的区别详解(附源码)

2016-08-04 11:38 411 查看

前言

前面提到过,可以在代码块里创建内部类,典型的方式是在一个方法体里面创建。局部内部类不能有访问说明符,因为它不是外围类的一部分;但是他可以访问当前代码块内的常量,以及此外围类的所有成员。下面的例子对局部内部类与匿名内部类的创建进行了比较。

示例源码

package com.mufeng.thetenthchapter;

interface Counter {
int next();
}

public class LocalInnerClass {
private int count = 0;

Counter getCounter(final String name) {
class LocalCounter implements Counter {

public LocalCounter() {
// TODO Auto-generated constructor stub
// Local inner class can have a constructor
System.out.println("LocalCounter()");
}

@Override
public int next() {
// TODO Auto-generated method stub
System.out.print(name);
return count++;
}

}

return new LocalCounter();
}

Counter getCounter2(final String name) {
return new Counter() {
// Anonymous inner class cannot have named constructor,only an
// instance initializer
{
System.out.println("Counter()");
}

@Override
public int next() {
// TODO Auto-generated method stub
System.out.print(name);
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());
}
}
}


输出结果

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


源码解析

Counter返回的是序列中的下一个值。我们分别使用局部内部类和匿名内部类实现了这个功能,它们具有相同的行为和能力。既然局部内部类的名字在方法外是不可见的,那为什么我们仍然使用局部内部类而不是匿名内部类呢?唯一的理由是,我们需要一个已命名的构造器,或者需要重载构造器,而匿名内部类只能用于实例初始化。
所以使用局部内部类而不使用匿名内部类的另一个理由就是,需要不止一个该内部类的对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: