第10章 内部类

可以将一个类的定义放在另一个类的定义内部,这就是内部类。它了解外围类,并能与之通信。

  • 10.1 创建内部类
    1. 如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象(如静态方法中),必须具体致命这个对象的类型:OuterClassName.InnerClassName。如Outter.Inner inner = outter.getInner();
  • 10.2 链接到外部类
    1. 当生成一个内部类的对象时,此对象与制造它的外围对象(enclosing object)之间就有了一种联系(一个指向那个外围类对象的引用),所有它能访问其外围对象的所有成员(包括private),而不需要任何特殊条件。
    2. “迭代器”设计模式。(代码)
    3. 内部类的对象只能在与其外围类的对象相关联的情况下才能被创建(非static类),构建内部类对象时,需要一个指向其外围类对象的引用。

  • 10.3 使用.this与.new
  1. 内部类调用Outter.this获得其持有的外部类的对象。
  2. 创建的内部类的对象中必须持有其外部类对象的引用,所以要用到.new语法:外部类实例.new InnerClass();。(非嵌套类(静态内部类))

  • 10.6 匿名内部类
  1. 如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,必须要将其参数引用设置成final的。(这个经测试不正确,不用final编译器并没有报错
  2. 匿名类没有命名构造器,只能通过实例初始化(在内存中开辟一个类的对象 new Class())达到一样的效果。
  3. 匿名内部类与正规的继承相比:前者不能同时extends类和implements接口,也不能implements两个接口。

  • 10.7 嵌套类
    1. 如果不需要内部类对象与其外围类对象之间有联系,那么可以将内部类声明为static。通常被称为嵌套类。
    2. 创建嵌套类的对象,不需要外围类的对象。
    3. 不能从嵌套类的对象中访问非静态的外围对象。
    4. 普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类中不能有static数据和static字段,也不能有嵌套类。(static变量声明要求静态环境或者顶层环境。而final static变量可以试因为Java在编译时把这个常量放在常量池中。
    5. 一个内部类被嵌套多少层并不重要,它能透明的访问所有它所嵌入的外围类的所有成员。
  • 10.8 为什么需要内部类
    1. 每个内部类都能独立的继承自一个接口的实现,因此内部类使得多重继承的解决方案变得完整。
    2. 内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。
    3. 可以让多个内部类以不同的方式实现同一个接口或者继承同一个类。(GreenhouseControls)
    4. 应用程序框架:被设计用以解决某类特定问题的一个类或者一组类。
  • 10.9 内部类的继承
    1. 内部类的构造器必须连接到指向其外围类对象的引用,所以要传递一个指向外围类对象的引用,并调用enclosingClassReference.super()。

  • 10.10 内部类可以被覆盖吗
  1. 直接定义个基类中的内部类是不会覆盖的(互不影响),必须要指明。

  • 10.12 内部类标识符
  1. 外围类的名字,加上“$”,再加上内部类的名字。如果是匿名内部类,编译器会简单的产生一个数字作为其标识符。

Telegram频道已经开通,关注flyzythink,随手分享正能量,了解VPS优惠与补货
Telegram群组已经开通,加入flyzy小站,FREE TO TALK
QQ群开通:780593286 flyzy小站
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注