Java 编程思想学习笔记-内部类

2019-06-06

本博客所有文章采用的授权方式为 自由转载-非商用-非衍生-保持署名 ,转载请务必注明出处,谢谢。

声明:
本博客欢迎转发,但请保留原作者信息!
博客地址:王超的博客;
内容系本人学习、研究和总结,如有雷同,实属荣幸!

10.内部类

10.2 链接到外部类

当生成一个内部类的对象时,此对象与制造它的外围对象有一种联系,所以他能访问外围对象所有成员,拥有外围类的所有对象的访问权。

  • 迭代器设计模式

10.3 .this和.new

如果需要生成对外部对象的引用,可以使用外部类名字加.this 如果要创建一个内部类对象,使用外部类对象的引用加.new创建内部类对象。 没有外部对象无法创建内部类对象,但是如果是嵌套类则不需要外部引用。

10.5 在方法和作用域内的内部类

可以在一个方法里面或者在任意的作用域内定义内部类,这么做有两个理由:

  1. 你实现了某类型的接口,于是可以创建并返回对其的引用。
  2. 你要解决一个复杂的问题,想创建一个类来辅助,但是又不希望这个类是共用的。

10.7 嵌套类

如果不需要内部类对象和外围类对象之间有联系,可以将内部类声明为static,这通常称为嵌套类。这意味着:

  1. 要创建嵌套类的对象,并不需要其外围类的对象。
  2. 不能从嵌套类的对象中访问非静态的外围类对象。

10.7.1 接口内部的类

正常情况下,不能在接口内部放置任何代码,但嵌套类可以作为接口的一部分。放入接口中的任何类都自动是public和static的。

10.7.2 从多层嵌套的内部类中访问外部类的成员

一个内部类被嵌套多少层并不重要–它能透明的访问所有它所嵌入的外围类的成员。

10.8 为什么需要内部类

如果只是需要一个对接口的引用,如果能满足要求,那么应该使用外围类去实现这个接口。使用内部类最吸引人的原因是:

每个内部类都能独立继承一个接口的实现,所以无论外围类是否已经继承某个接口的实现,对于内部类没有影响。

内部类允许继承多个非接口类型,有效实现了多重继承。 如果不需要解决多重继承的问题,可以不使用内部类,但是如果使用,可以获得一些特性:

  1. 内部类可以有多个实例,每个实例有自己的状态信息,和外网类相对独立。
  2. 单个外围类,可以让多个内部类以不同方式实现一个接口或者一个类。
  3. 创建内部类对象的时刻,不依赖外围类对象的创建。
  4. 没有令人迷惑的”is-a”关系;是一个独立的实体。

10.8.1 闭包和回调

闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。通过这个定义,可以看出内部类是面向对象的闭包。 通过回调,对象能够携带一些信息,这些信息允许它在稍后的某个时刻调用初始的对象。

10.8.2 内部类和控制框架

应用程序框架就是被设计用以解决某类特定问题的一个类或者一组类。使用通常是继承并覆盖方法。

  • 模板设计模式

使变化的事物与不变的事物相互分离,是这个设计的关键所在。 内部类允许:

  1. 控制框架的完整实现是由单个类创建的,从而使实现的细节被封装起来。内部类用来表示解决问题所必须的各种不同的动作。
  2. 内部类能够很容易访问外围类的任意成员,所以可以避免这种实现变得笨拙。

10.9 内部类的继承

内部类的构造器必须连接到指向外围类对象的引用,所以在继承内部类的时候,外围类的对象的引用必须被初始化,所以需要用特殊的语法进行关联。

10.10 内部类可以被覆盖吗?

当继承某个外围类时,内部类并没有发生什么神奇的变化。内部类时完全独立的两个实体,各自在自己的命名空间内。

明确继承一个内部类也是可行。

10.11 局部内部类

为什么使用局部内部类而不是匿名内部类?唯一的理由是,我们需要一个已命名的构造器或者需要重载构造器,而匿名内部类只能用于实例初始化。另一个理由是,需要不止一个该内部类的对象。

10.12 内部类标识符

每个类都会产生一个.class文件,内部类的命名是外围类的名称+$+内部类的名称,如果是匿名内部类,则自动增加一个数字来标识。

文章评论

comments powered by Disqus


章节列表