zoukankan      html  css  js  c++  java
  • 内部类2——为什么需要内部类?

    一,为什么需要内部类?
    一般说来,内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象。所以可以认为内部类提供了某种进人其外围类的窗口。
     
    内部类必须要回答的一个问题是:如果只是需要一个对接口的引用,为什么不通过外围类实现那个接口呢?答案是:“如果这能满足需求,那么就应该这样做。”那么内部类实现一个接口与外围类实现这个接口有什么区别呢?答案是:后者不是总能享用接口带来的方便,有时需要用到接口的实现。所以,使用内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
     
    如果没有内部类提供的、可以继承多个具体的或抽象的类的能力,一 些设计 与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。也就是说,内部类允许继承多个非接口类型(译注:类或抽象类)
    如果不需要解决“多重继承”的问题,那么自然可以用别的方式编码,而不需要使用内部类。但如果使用内部类,还可以获得其他一些特性:
          1)内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。
          2)在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。稍后就会展示一个这样的例子。
          3)创建内部类对象的时刻并不依赖于外围类对象的创建。
          4)内部类并没有令人迷惑的"is-a" 关系;它就是一个独的实体。
           举个例子,如果Sequenc.java不使用内部类,就必须声明“Sequence是一个Selector,对于某个特定的Sequence只能有一个Selector.然而使用内部类很容易就能拥有另一个方法reverseSelector() , 用它来生成一个反方向遍历序列的Selector.只有内部类才有这种灵活性
     
    二,闭包
    闭包是一个可调用的对象,他记录了一些信息,这些信息来自于创建他的作用域。通过这个定义,可以看出内部类是面向对象的闭包,,因为它不仅仅包含外围类对象的信息,还自动拥有一个指向外围类对象的引用,在此作用域内,内部类有权操作所有的成员,包括private成员
    回调的价值在于它的灵活性,在运行时状态决定调用什么方法
    通过回调,对象能够携带一些信息,这些信息允许他在某个时刻调用初始的对象
  • 相关阅读:
    笔记
    Jquery 实现select 3级级联查询
    将properties文件的配置设置为整个Web应用的全局变量。
    jquery ajax异步提交表单数据
    tomcat : 虚拟路径映射
    使用bootstrap-select控件 搜索栏键入关键字动态获取后台数据
    Springboot解决ajax跨域的三种方式
    oracle中的递归查询语句
    oracle使用序列自定义固定长度id
    JVM内存空间
  • 原文地址:https://www.cnblogs.com/QianYue111/p/10209700.html
Copyright © 2011-2022 走看看