1.使用内部类的原因:
a.内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据
b. 内部类可以对同一个包中的其他类隐藏起来
c.当想要定义一个回调函数又不想编写大量代码时,使用匿名内部类比较便捷
2.内部类的对象总存在一个隐式引用,它指向了创建它的外部类对象。这个引用在内部类的定义中是不可见的。外部类的引用在构造器中设置,编译器修改了所有内部类的构造器,添加一个外围类的引用参数。如果内部类没有定义构造器,那么编译器会为它生成一个带有外部类引用的默认构造器。
3.内部类是一种编译器现象,与虚拟机无关。编译器会把内部类翻译成用$(美元符号)分割内部类名和外部类名的常规类文件,而虚拟机对此一无所知。
4.编译器为了引用外围类,生成了一个外围类的实例域。
5.如果一个内部类使用的频率很低,可以把它包装在外部类的一个方法里,称为局部内部类。局部类不能使用public或private访问说明符进行声明,它的作用被限定在声明这个局部类的块中。局部类有一个优点,即对外部世界可以完全隐藏起来,除了包裹内部类的方法外没有任何其他方法知道它的存在。
6.匿名内部类必须且只继承一个类或一个接口,并且不能定义构造函数,也不能存在任何静态成员变量和静态方法。匿名内部类不能是抽象的,它必须实现继承类或接口的所有抽象方法。
7.拷贝引用,为了避免引用值发生改变,例如被外部类的方法修改等,而导致内部类得到的值不一致,于是用final来让该引用不可改变。故如果定义了一个匿名内部类,并且希望它使用一个其外部定义的参数,那么编译器会要求该参数引用是final的。
8.在内部类不需要访问外围类对象时,应该使用静态内部类,静态内部类就是在一个内部类前面用static修饰。所以静态内部类只能访问外部类的静态变量和方法。静态内部类的实例创建不用依赖外部类的实例,它可以师姐使用
OuterClass.InnerClass a=new OuterClass.InnerClass();来创建