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

  • 相关阅读:
    GhostBSD 3.0RC3,基于GNOME的FreeBSD
    Nagios 3.4.3 发布,企业级监控系统
    Jolokia 1.0.6 发布, JMX远程访问方法
    微软希望开发人员不要使 WebKit 成为新版 IE6
    Kwort Linux 3.5 正式版发布
    EJDB 1.0.24 发布,嵌入式 JSON 数据库引擎
    Pale Moon 15.3 Firefox“苍月”优化版发布
    Galera Load Balancer 0.8.1 发布
    SmartSVN V7.5 正式发布
    PostgresQL建立索引如何避免写数据锁定
  • 原文地址:https://www.cnblogs.com/ysw-go/p/5430218.html
Copyright © 2011-2022 走看看