目录
Java 编程思想 (一) 第 1~4 章: 概述
Java 编程思想 (二) 第 5 章: 初始化和清理
Java 编程思想 (三) 第 6 章: 访问权限
Java 编程思想 (四) 第 7 章: 复用类
Java 编程思想 (五) 第 8 章: 多态
Java 编程思想 (六) 第 9 章: 接口
Java 编程思想 (七) 第 10 章: 内部类
Java 编程思想 (八) 第 11 章: 持有对象
Java 编程思想 (九) 第 12 章: 异常
Java 编程思想 (十) 第 13 章: 字符串
Java 编程思想 (十一) 第 14 章: 类型信息
Java 编程思想 (十二) 第 15 章: 泛型
第 10 章 内部类
10.1 链接到外部类
Java 非 static 的普通内部类自动拥有对其外围类所有成员的访问权.
a. Java&C++ 的区别:
Java 普通内部类能访问其外围对象 (enclosing object) 的所有成员, 而不需要任何特殊条件 .C++ 嵌套类的设计只是单纯的名字隐藏机制, 与外围对象没有联系, 也没有隐含的访问权.
b. Java 实现原理:
在 Java 中, 当某个类创建一个内部类对象时, 此内部类对象必定会秘密地捕获一个指向那个外围类的对象的引用. 然后, 在你访问此外围类的成员时, 就是用那个引用来选择外围类的成员. 这些细节是由编译器处理的. Java 的迭代器复用了这个特性.
10.2 .this 与 .new
Java 非 static 的普通内部类可应用. this 返回其外围对象的引用.
外围对象可应用. new 来生成一个内部类对象.
- public class DotThis{
- public class Inner{
- public DotThis outer(){
- return DotThis.this; // a plain "this" would be Inner's"this"
- }
- }
- public Inner inner(){ return new Inner(); }
- public static void main(String[] args){
- DotThis dt = new DotThis();
- DotThis.Inner dti = dt.inner();
- dti.outer().f();
- }
- }
10.3 匿名内部类
Anonymous Inner Class.: 没有定义 class name 的内部类.
10.4 Java 嵌套类
嵌套类: 内部类声明为 static 时, 不再包含外围对象的引用. this, 称为嵌套类(与 C++ 嵌套类大致相似, 只不过在 C++ 中那些类不能访问私有成员, 而在 Java 中可以访问).
- 创建嵌套类, 不需要外围对象.
- 不能从嵌套类的对象中访问非静态的外围对象.
10.4.1 接口内部的类
嵌套类可以作为接口的一部分(正常情况下, 接口内部不能放置任何代码). 放到接口中的任何类都自动是 public 和 static 的. 因为类是 static 的, 只是将嵌套类置于接口的命名空间内, 这并不违反接口的规则.
10.4.2 从多层嵌套类中访问外部类的成员
一个内部类被嵌套多少层并不重要 -- 它能透明地访问它所嵌入的外围类的所有成员.
10.5 为什么需要内部类
内部类继承自某个类或实现某个接口, 内部类的代码操作创建它的外围类的对象. 所以可以认为内部类提供了某种进入其外围类的窗口.
内部类实现一个接口与外围类实现这个接口有什么区别呢? 答案是: 后者不是总能享用到接口带来的方便, 有时需要用到接口的实现. 所以, 使用内部类最吸引人的原因是:
每个内部类才能独立地继承自一个 (接口的) 实现, 所以无论外围类是否已经继承了某个 (接口的) 实现, 对于内部类都没有影响.
内部类使得多重继承的解决方案变得完整. 接口解决了部分问题, 而内部类有效地实现了 "多重继承". 也就是说, 内部类使得 Java 实现继承多个非接口类型(类或抽象类).
10.6 闭包与回调
闭包 (closure) 是一个可调用的对象, 它记录了一些信息, 这些信息来自于创建它的作用域. 通过这个定义可以看出内部类是面向对象的闭包, 因为它不仅包含外围类对象 (创建内部类的作用域) 的信息, 还自动拥有一个指向此外围类对象的引用(.this), 在此作用域内, 内部类有权操作所有的成员, 包括 private 成员.
回调(callback), 通过回调, 对象能够携带一些信息, 这些信息允许它在稍后的某个时刻调用初始的对象. Java 中没有指针, 通过内部类提供的闭包功能可以实现回调.
10.7 局部内部类
在代码块 | 方法中定义的类.
应用场景: class 定义 & 和 new Object() 均位于方法内部.
10.8 Java 接口和内部类总结
Java 的接口和内部类比其他面向对象的概念更深奥复杂, C++ 没有这些, 将两者结合起来, 同样能够解决 C++ 中的用多重继承所能解决的问题.
来源: https://blog.csdn.net/cbk861110/article/details/104095233