码迷,mamicode.com
首页 > 其他好文 > 详细

局部内部类和匿名内部类的对比

时间:2016-04-25 11:48:43      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:

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

具体代码实现:

 1 package thinking.in.java.demo;
 2 
 3 //定义一个接口
 4 interface Counter {
 5     int next();
 6 }
 7 
 8 // 主类LocalInnerClass
 9 public class LocalInnerClass {
10     // 定义一个计数标记count;
11     private int count = 0;
12 
13     // 使用局部内部类
14     Counter getCounter(final String name) {
15         class LocalCounter implements Counter {
16             public LocalCounter() {
17                 System.out.println("LocalCount()");
18             }
19 
20             public int next() {
21                 System.out.print(name+":");
22                 return count++;
23             }
24         }
25         // 局部内部类和匿名内部类最大的不同之处:局部内部类可以返回不止一个内部类的对象
26         // 与下面的匿名内部类的代码形成鲜明对比
27         return new LocalCounter();
28     }
29 
30     // 使用匿名内部类
31     Counter getCounter2(final String name) {
32         return new Counter() {
33             {
34                 System.out.println("Counter");
35             }
36 
37             @Override
38             public int next() {
39                 System.out.print(name+":");
40                 return count++;
41             }
42         };
43     }
44 
45     /**
46      * @param args
47      */
48     public static void main(String[] args) {
49         LocalInnerClass lic = new LocalInnerClass();
50         // 局部内部类
51         Counter c1 = lic.getCounter("Local inner");
52         // 匿名内部类
53         Counter c2 = lic.getCounter2("Anonymous inner");
54         for (int i = 0; i < 5; i++) {
55             System.out.println(c1.next());
56         }
57         for (int j = 0; j < 5; j++) {
58             System.out.println(c2.next());
59         }
60     }
61 
62 }

运行结果:

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返回的是序列中的下一个值。我们分别使用局部内部类和匿名内部类是实现了这个功能,它们具有相同的行为和方法。既然局部内部类的名字在方法外是不可见的,那为什么我们仍然使用局部内部类而不是匿名内部类呢?唯一的理由是:我们需要一个已经命名的构造器,或者需要重载构造器,而匿名内部类只能用于实例的初始化,所以使用局部内部类而不使用匿名内部类的另一个理由是,需要不止一个内部类对象。

局部内部类和匿名内部类的对比

标签:

原文地址:http://www.cnblogs.com/ysw-go/p/5430218.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!