1.本章上来第一句就说了什么是内部类,一个在类的定义放在另一个的类内部。
2.内部类拥有外部类其外围类的所有元素的访问权,包括私有的。
3.当某个外围类的对象创建了一个内部类对象时,吃内部类对象必定会秘密地捕获一个指向那外围类对象的引用。然后在你访问此外围类的成员时,就是用那个引用来选择外围类的成员的。这些编译器豆瓣我们做好了,我们可以之前看到的是,内部类的对象只能在于其外围类的对象相关联的情况下被创建(在内部类是非 static 时)。
4.在拥有外部类对象之前不可能创建内部类对象,因为内部类对象会隐式的持有外部类对象的引用,而其实用 static 修饰的内部类叫嵌套类,嵌套类不需要对外部类对象的引用,这个我们后面会介绍到。
5.内部类的作用之一是隐藏代码实现,此外还有就是实现某个接口,从而向上转型并返回对其的引用。
6.在方法的作用域内创建的类,叫做局部内部类。
7.当然在6的基础上其实内部类,可以放在任意的作用域内,例如:if 语句内等等。
8.匿名内部类,也就是没有名字,作用是创建一个继承自 A 的匿名类的对象,然而如果我在匿名内部类创建的别的特性,在我向上转型后,这些特性其实又消失掉了,因为这是一个没有名字的类,所以也就无从谈起它的向下转型,而我向上转型后也只是可以调用基类的一些属性,所以匿名内部类可以用来创建某个接口的实现类等等。
9.匿名内部类不可能有构造器,因为它连名字都没有。
10.如果方法中的某个变量被匿名内部类使用到,那么就必须要加 final 前缀,前面的参数只是传递到了构造中,所以无需 final,而后面的参数被匿名内部类使用,所以需要使用 final 修饰,我之前一直不是特别懂为什么,之前去网上查过,记得好像是说,方法结束后,但是我依然需要使用那么变量,正常情况下, 方法的参数随着方法调用的技术也就消失了,所以为了可以更长时间的被引用着,即方法被销毁后依然可以使用(可能说的不对,还是请自行 Google)。
11.嵌套类,书中是这么介绍嵌套类的,如果不需要内部对象与其外围类对象之间有联系,那么就可以将内部类声明为 static,这通常称为嵌套类。
12.创建普通的内部类对象会隐式的持有一个外围类对象的引用,而嵌套类不是,这也意味着:
(1)要创建嵌套类的对象,并不要其外围类的对象。
(2)不能从嵌套类的对象中访问非静态的外围类对象。
13.其实嵌套类使用了 static 修饰,也就说明了它其实是独立于对象的。
14.普通的内部类不能有 static 数据和 static 字段,也不能有嵌套类,而嵌套类啥都能有。
15.接口中的内部类为嵌套类,因为接口中的类都被自动的变成 public 和 static 的了。
16.为什么需要内部类?书中给了这样的答案:每个内部类都能独立的继承自一个(接口的)实现,所以不论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。所以说实在的还是使得多重继承的解决方案变得更完整,接口已经解决了部分问题,而内部类有效地实现了“多重继承”。
17.内部类可以有多个实例,每个实例都有自己的状态信息,并且与外围类对象的信息想独立。
18.在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个可类。
19.内部类的继承使用,如果只是使用 Dot 默认的无参构造会报错,而必须使用 Dot 继承的内部类的外围类的对象作为构造参数,并通过 super() 调用 DotNew 的构造,使得 DotNew 得到初始化,这样才能使得继承的内部类有外围类引用,因为我们都知道继承的时候我们会先去执行父类的构造,而内部类需要一个外围类的引用,所以就要先初始化内部类的外围类,使得内部类的构造得到正常的初始化(我是这么认为的)。
20.局部内部类与匿名内部类相比,局部内部类可以有构造器,而构造器就可以让我们进行初始化。