第十章 内部类

 

一、连接到外部类

  当生成一个内部类对象时,此对象与制造它的外部对象之间就有了一种联系,所以它可以访问外部对象的所有成员,而不需要任何特殊条件。

二、使用.this与.new

  如果你需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟(外部类名.this)。

  要想创建内部类对象,必须使用外部类对象来创建(外部类引用.new 内部类名())。

  在拥有外部类之前,是不能创建内部类的。这是因为内部类对象会暗暗的连接到创建它的外部类对象上。但是如果你创建的是静态内部类,那么它就不需要对外部类对象的引用

  

  由于内部类的对象保存有外部类对象的引用,因而不能在内部类中定义静态属性。换言之就是非静态内部类不能脱离外部类而独立存在。

三、内部类与向上转型

  当将内部类向上转型为其父类,尤其是转型为一个接口的时候,内部类就有了价值。因为内部类的不可见性,可以很好的隐藏实现的细节

 

四、在方法与作用域内的内部类

  1)你实现了某类型的接口,于是可以创建并返回对其的引用

  2)你要解决一个复杂的问题,想创建一个类来辅助你的解决方案,但是又不希望这个类是公用的。

    (1)在方法内部的类(局部内部类)

    外部是无法访问的,但是方法可以返回内部类的引用,但是必须向上造型为其接口。

    你可以在同一个子目录下的任意类中对某个内部类使用相同的标识,这并不会产生命名冲突。

  3)在任意的作用域内嵌入一个内部类

    只能在作用域中使用(例如if作用域)

 

五、匿名内部类(实现工厂方法)

  new 类名(){。。。} :创建一个继承自类名的匿名类的对象。并使用默认构造器构造对象(也可以传参数进去)。

  内部类中想使用一个在其外部定义的对象,那么编译器会要求其参数引用是final的。(传递给父类的参数不需要是final的)

  内部类既可以实现接口,也可以继承,即使实现接口,也只能实现一个。

六、嵌套类

  如果不需要内部类对象与其外围类对象之间有联系,那么,可以将内部类声明为static。这通常称为嵌套类

七、接口内部的类

  静态内部类,可以在接口中声明

  如果你想要创建某些公共代码,使得他们可以被某个接口的所有不同实现所公用,那么使用接口内部的静态内部类会很方便。

八、为什么需要内部类

  一般来说,内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象。可以认为内部类提供了某种进入外围类的窗口。

  每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类没有影响。内部类使得多继承变得完美。

  使用内部类的一些特性:

    1)内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。

    2)在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。

    3)创建内部对象的时刻并不依赖于外部类对象的创建。

    4)内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。

  

  闭包与回调

  闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。

九、内部类与控制框架

  应用程序框架就是被设计用以解决某类特定问题的一个类或一组类。要使用某个应用程序框架通常是继承或实现一个类。

  控制框架是一类特殊的应用程序框架,它用来解决响应事件的需求。主要用来响应事件的系统被称作事件驱动系统。

十、内部类的继承

  因为内部类的构造函数必须连接到指向其外围类对象的引用,所以在继承内部类的时候,事情会变得有点复杂。问题在于,那个指向外围类对象的“秘密引用”必须被初始化,而在子类中不存在颗连接的默认对象

  必须使用特定的语法:默认构造不行,必须带上内部类的引用,并调用内部类的super();

十一、内部类可以被覆盖吗

  内部类不能覆盖(覆盖类),明确继承某个内部类是可以的(覆盖方法)。

 

局部内部类与匿名内部类

使用局部内部类的理由:

   1)需要一个构造函数,或者需要重载构造函数,匿名内部类只能用于实例初始化。

   2)需要布置一个该内部对象。

 

posted @ 2017-11-09 16:07  js王  阅读(199)  评论(0编辑  收藏  举报