1.内部类能访问外围类的所有元素
2.内部类实现迭代器,比如
public class Sequence{
private Object[] seq;
private class SequenceIterator{
public boolean hasNext(){};
public Object next(){};
}
public SequenceIterator Iterator(){
return new SequenceIterator();
}
}
3.在拥有外部类对象之前是不可能创建内部类对象的,因为内部类对象会隐藏引用外部类对象。(.this .new )
所以要引用内部类,必须使用外部类的对象.new 内部类名称l
4.内部类常用场景是:定义一个类,但这个类又不想是公共类,然后就添加一个public 来获取这个类的对象
把类写在方法里,方法返回这个类的对象,这个类实现接口。p196
5内部类不管在哪个作用域,都会被编译的,所以一般一个有内部类的有两个class喃,你说是吧傻逼
6.匿名内部类
1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
2、匿名内部类中是不能定义构造函数的。
3、匿名内部类中不能存在任何的静态成员变量和静态方法。
4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
7当给匿名内部类传参时,必须是final(
简单理解就是,拷贝引用,为了避免引用值发生改变,例如被外部类的方法修改等,而导致内部类得到的值不一致,于是用final来让该引用不可改变。
故如果定义了一个匿名内部类,并且希望它使用一个其外部定义的参数,那么编译器会要求该参数引用是final的。)
8.使用匿名内部类构建工厂方法更加优雅。
9.嵌套类就是static修饰的内部类,普通内部类不能有static成员变量或者引用(嵌套类包含静态嵌套类和非静态嵌套类,非静态嵌套类就是内部类)
9.为什么需要内部类:可以解决多重继承,用内部类进行继承,方法进行返回某个内部类的对象
p207:这个例子进一步展示了外围类实现一个接口与内部类实现此接口之间的区别。就代码而言,Callee1是简单的解决方式。Callee2继承自MyIncrement,后者已经有了一个不同的increment()方法,并且与Incrementable接口期望的increment()方法完全不相关。
所以如果Callee2继承了MyIncrement,就不能为了Incrementable的用途而覆盖increment()方法,于是只能使用内部类独立地实现Incrementable。还要注意,当创建了一个内部类时,并没有在外围类的接口中添加东西,也没有修改外围类的接口。
注意,在Callee2中除了getCallbackReference()以外,其他成员都是private的。要想建立与外部世界的任何连接,interface Incrementable都是必需的。在这里可以看到,interface是如何允许接口与接口的实现完全独立的。
内部类Closure实现了Incrementable,以提供一个返Callee2的“钩子”(hook)——而且是一个安全的钩子。无论谁获得此Incrementable的引用,都只能调用increment(),除此之外没有其他功能(不像指针那样,允许您做很多事情)。
Caller的构造器需要一个Incrementable的引用作为参数(虽然可以在任意时刻捕获回调引用),然后在以后的某个时刻,(Caller对象可以使用此引用回调Callee类。
回调的价值在于它的灵活性——可以在运行时动态地决定需要调用什么方法。
10内部类与控制框架
能够更清晰的了解内部类的多重继承作用