[1] 内部类,将一个类的定义放到另一个类的定义的内部。
[2] 当生成一个内部类对象时,该对象与制造它的外围对象有一种联系,它能访问其外围对象的所有成员。内部类拥有外部类的所有元素访问权限。
[3] .this 和 .new的用法 DotThis.Inner dtii = dt.new Inner(); 内部和外部的通信方法。不能直接创建内部类的对象,要通过外部类的对象来.new创建。
[4] 在方法和作用域中定义内部类,注意其可用范围。if语句中定义类。
[5] 匿名内部类
public static GameFactory factory = new GameFactory(){
public Game getGame(){ return new Checkers();} //匿名内部类
};
[6] 嵌套类,就是static的内部类。普通的内部类对象隐式的保存了一个引用(指向创建它的外围类对象),static的内部类则没有。普通的内部类也不能含有static对象。
[7] static内部类,可以脱离外部类,独立创建对象。
10.8 为什么需要内部类
[1] 内部类的优势:每个内部类都能独立的继承自一个接口实现,外围类是否实现,对内部类没有任何影响。
[2] 接口解决了部分多重继承问题,内部类帮助解决。实现多继承的一种方式,基类为非接口时:
class D{}
abstract class E{}
class Z extends D{
E makeE(){ return new E(){};}//匿名内部类
}
[3] 闭包和回调,内部类是面向对象的闭包,包含外围类对象的信息,还自动拥有一个指向外围类对象的引用。
[4] 控制框架,一类特殊的应用程序框架。变化的事物和不变的事物分隔开来。
10.9 内部类继承
内部类的继承:要有特殊的语法。 首先导出类的默认构造函数不适用,必须是以其所继承的内部类的外部类为参数,外部类调用.super(),来初始化。因为内部类构造器必须连接到指向其外围类对象的引用,导出类中不存在默认的连接对象,必须显式定义出出来。
10.10 内部类可以被覆盖吗
覆盖之后没有任何的效果,当继承某个外围类的时候,内部类没有变化。两个内部类是完全独立的两个实体,各自在自己的命名空间中。(例子中,继承中导出类构造时,要先构造基类的方法(成员初始化,构造函数调用))。
10.11 局部内部类
在某个方法体里边创建内部类:效果基本等同于匿名类,但是匿名类只能用于实例初始化return newAnonymousClassName(){ //… };
局部内部类,有名字,可以定义不只一个对象。
10.12 内部类标识符
OuterClassName$1InnerName.class, 匿名的OuterClassName$1(数值).class
接口和内部类结合,解决C++中的多重继承问题。