zoukankan      html  css  js  c++  java
  • 局部内部类和匿名内部类的对比

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

    具体代码实现:

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

  • 相关阅读:
    微软官方Silverlight5新特性完整介绍
    Windows Phone 7外包(承接WP7项目外包 可签合同 长期有效)
    我们为什么要选择Silverlight?(CSDN网友的见解分享大家)【转】
    开博记录02120928
    [转载]在linux下如何制作img的映像文件
    JavaScript中的null和undefined
    年度映像
    25岁毕业,拿一万块钱月薪
    saymedia bug问题
    mxp组件开发及jsfl文件
  • 原文地址:https://www.cnblogs.com/ysw-go/p/5430218.html
Copyright © 2011-2022 走看看