第十章 内部类

文章目录

          • 1.创建内部类
          • 2.链接到外部类
          • 3.使用 .this 和 .new
          • 4.内部类与向上转型
          • 5.在方法和作用域的内部类
            • 理由
          • 6.匿名内部类
          • 7.嵌套类
            • 接口内部的类
            • 多层嵌套类中访问外部类的成员
          • 8.为什么要内部类
            • 闭包与回调
            • 内部类与控制框架
          • 9.内部类的继承
          • 10.内部类可以覆盖吗
          • 11.局部内部类
          • 12.内部类标识符

第十章 内部类_第1张图片

1.创建内部类
  1. 把类的定义置于外围类的内部
  2. 外部类将有一个方法指向内部类的引用
  3. 如果想从外部类除了静态方法之外的任意地方创建内部类对象,必须在main()中
2.链接到外部类
  • 内部类自动拥有对其外围类所有成员的访问权
3.使用 .this 和 .new
  1. 如果需要生成外部类对象的引用,可以使用外部类的名字紧跟“.this”
  2. 如果要生成内部类的对象的引用,可以使用外部类的名字后面紧跟“.new”
  3. 如果创建的是”嵌套类“(静态内部类)那不它就不需要对外部类对象的引用
4.内部类与向上转型
  • 内部类(某个接口的实现)完全不可见,并且不可用。所得到的指向基类和接口的引用,所以能隐藏细节
5.在方法和作用域的内部类
  1. 可以在一个方法内部或者在任意作用域内定义内部类

  2. 理由
  • (1) 实现了某类型的接口,于是可以创建并返回对其引用
  • (2) 你要解决复杂问题,想创建一个类来辅助你的解决方案,但是又不希望这个类是共用的
  1. 局部内部类:在方法的作用域内的内部类
  2. 在作用域外,定义在作用域内的内部类是无法使用的,除此之外和普通类没有区别
6.匿名内部类
  1. 没有名字的内部类
  2. 匿名内部类最后的分号是表达式结束的意思,刚好匿名内部类就是表达式
  3. 如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器要求其参数引用是final
  4. 在匿名内部类中不可能命名构造器(因为它根本没有名字)但可以通过初始化实例,就能达到匿名内部类创建一个构造器的效果
  5. 若变量不在匿名内部类中直接使用,可以不是final
  6. 若变量在匿名内部类中直接使用,必须是final
  7. 因为匿名内部类可以扩展类,也可以实现接口,但两者不能兼备,而且只能实现一个接口
7.嵌套类
  1. 如果不需要内部类与外部类有联系,可以将内部类声明为static,通常称之为嵌套类

  2. 要创建嵌套类不需要其外部类的对象

  3. 不能从嵌套类中访问的非静态的外围类对象

  4. 嵌套类就没有这个特殊的this引用,这使得于一个static方法

  5. 接口内部的类
  • (1) 嵌套类可以作为接口的一部分(类是stiatic的)
  • (2) 可以在内部类实现接口
  • (3) 使用某些公共代码,使得他们可以被某个接口的所有不同实现所共用,那么就可以使用接口内的嵌套类
  1. 多层嵌套类中访问外部类的成员
  • 一个内部类能够透明的访问所有他嵌入的二外围类的所有成员
8.为什么要内部类
  1. 内部类提供了某种进入外围类的窗口

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

  3. 内部类允许继承多个非接口类型

  4. 如果是抽象类或具体的类,而不是接口,只有用内布列才能多重继承(类只能同时继承一个普通类)

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

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

  7. 创建内部类对象的时候,并不依赖于外围类对象的创建

  8. 内部类并没有迷惑的“is-a”关系,是个独立的实体

  9. 闭包与回调
  • (1) 闭包是一个可调用的对象,他保存了创建它的作用于的信息
  • (2) 回调的价值在于它的灵活性——可以在运行时动态地决定需要调用什么方法
  1. 内部类与控制框架
  • (1) 控制框架

  • (2) 应用程序框架

    继承一个或多个类,并覆盖某些方法,解决特定问题

  • (3) 模板方法

    包含算法的基本结构,并调用一个或多个客服该方法,以完成算法的动作

  • (4) 设计模式

    将变化的事物和保持不变的事物分离开来(可变覆盖的方法就是可变的事物)

  • (5) 事件驱动系统

    响应事件的系统

  • (6) 控制整个框架的完整实现是由单个类创建的,从而使得实现细节被封装

  • (7) 内部类可以很容易的访问外围类成员

  • (8) 命令设计模型

9.内部类的继承
  • 一个内部类继承自另外一个类的内部类,要使用:外部类对象引用.super(参数)
10.内部类可以覆盖吗
  1. 两个内部类是完全独立的两个实体,有各自的命名空间
  2. 可以明确的继承某个内部类
11.局部内部类
  1. 在方法中的内布类
  2. 局部内部类不能有访问说明符
  3. 局部内部类可以访问当前代码块的常量以及此外围类的所有成员
  4. 局部内部类的方法名在方法外是不可见的
  5. 局部内部类可以命名构造器,它的构造器可以被重载,而匿名内部类只能用于实例初始化
12.内部类标识符
  1. 内部类生成的“.class”文件,以包含其class对象信息。
  2. 格式:外围类名字 + $ + 内部类名字
  3. 如果内部类是匿名的,编译器会简单的生成一个数字

你可能感兴趣的:(Java编程思想,java)