内部类
创建内部类
- 如果想从外部类的非静态方法之外的任意位置创建内部类的对象,必须具体的指明这个对象的类型。
链接到外部类
- 内部类能访问其外围对象的所有成员,而不需要任何特殊的条件
- 内部类自动拥有对其外围类所有队员的访问权
- 当某个外围类的对象创建了一个内部类对象时,此时内部类对象必定会秘密的捕获一个指向那个外围类对象的引用,然后在访问此外围类的成员时,就是用哪个引用来选择外围类的成员
- 创建内部类对象时,需要一个指向其外围类对象的引用
使用.this和.new
- 生成对外部类对象的引用,可以使用外部类的名字后.this
- 创建某个内部类对象语法:外部类引用.new 内部类()
- 要想创建内部类对象必须使用外部类对象来创建
- 在拥有外部类对象之前是不可能创建内部类对象的
- 嵌套类(静态内部类)不需要对外部类对象的引用
内部类与向上转型
- 从是想某个接口的对象得到此接口的引用与向上转型为这个对象的基类,实质上效果是一样的
在方法和作用域内的内部类
- 可以在一个方法或者任意的作用域内定义内部类
匿名内部类
- 创建一个继承自X的匿名类的对象,通过new表达式返回的引用被自动向上转型为对Contents的引用
- 如果定义一个匿名内部类,并且希望它使用一个在其内部定义的对象,那么编译器会要求其参数饮用是final的
嵌套类
- 当不需要内部类对象与外围类对象之间有联系,把内部类声明为static的
- 普通的内部类对象隐式的保存了一个引用,只想创建他的外围类对象
为什么需要内部类
- 每个内部类都能独立的继承自一个接口实现,无论外围类是否已经继承了某个接口,对于内部类都没有影响
- 内部类使得多重继承解决方案完整
- 内部类允许继承多个非接口类型,即内部类允许多继承
- 闭包是一个可调用的对象,他记录了创建它的作用域的信息
- 内部类是面向对象的闭包,它有权操作所有的成员包括private成员
内部类的继承
- 需要特殊语法以提供必要的引用(指向外围类)
内部类可以被覆盖吗
- 可以,但是等同于外围类的一个方法,实际没有特别作用
局部内部类
- 不能有访问说明符,可以访问当前代码块内的常量,以及此外围类的的所有成员
- 使用局部内部类而不用匿名内部类的理由是需要一个以上该类对象
内部类标识符
- 外围类$内部类.class
- 如果是匿名类,编译器会产生一个数字作为他的标识符