局部内部类和匿名内部类的对比
2016-04-25 11:11
411 查看
创建内部类的典型的方式是在一个方法体的里面创建,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是它可以访问当前代码块内的常量,以及此外围类的所有成员。下面的例子对局部内部类与匿名内部类的创建进行了比较。
具体代码实现:
运行结果:
在代码中,Counter返回的是序列中的下一个值。我们分别使用局部内部类和匿名内部类是实现了这个功能,它们具有相同的行为和方法。既然局部内部类的名字在方法外是不可见的,那为什么我们仍然使用局部内部类而不是匿名内部类呢?唯一的理由是:我们需要一个已经命名的构造器,或者需要重载构造器,而匿名内部类只能用于实例的初始化,所以使用局部内部类而不使用匿名内部类的另一个理由是,需要不止一个内部类对象。
具体代码实现:
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返回的是序列中的下一个值。我们分别使用局部内部类和匿名内部类是实现了这个功能,它们具有相同的行为和方法。既然局部内部类的名字在方法外是不可见的,那为什么我们仍然使用局部内部类而不是匿名内部类呢?唯一的理由是:我们需要一个已经命名的构造器,或者需要重载构造器,而匿名内部类只能用于实例的初始化,所以使用局部内部类而不使用匿名内部类的另一个理由是,需要不止一个内部类对象。
相关文章推荐
- Jmeter -- 属性和变量
- 缺少动态链接库: libthrift-0.9.3.so: cannot open shared object file: No such file or directory
- 三种聚类方法的简单实现
- Reset大全
- Java建造者模式,Android建造者模式的AlertDialog
- Nutch2.3+Hbase0.94环境搭建
- Apache的prefork模式和worker模式
- Objective-C Blocks 小测验
- CSS3的flexbox布局
- Json对象与Json字符串互转
- 剑指offer(9):跳台阶问题
- 用SignalR实现实时查看WebAPI请求日志
- VS快捷键
- ButterKnife--View注入框架
- 智能指针
- Properties类的使用和源码浅析
- iOS的文件存放路径
- Oracle 释放(恢复)数据文件大小
- Oracle的同义词
- Canvas绘制风向盘