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