内部类的使用
java的非静态内部类和匿名内部类会默认包含外部类的引用,因此在非静态(或匿名)内部类中我们可以直接访问外部类的方法和私有变量。但是静态的内部类是不会持有外部类的引用的,原因是这是编译器决定了的,编译器默认在非静态内部类和匿名内部类的构造函数中传入外部类,这个时候,需要注意了,当外部类与内部类生命周期不一致的时候很有可能发生内存泄漏。 例如在一个Activity启动一个Thread执行一个任务,因为Thread是内部类持有了Activity的引用,当Activity销毁的时候如果Thread的任务没有执行完成,造成Activity的引用不能释放,Activity不能被释放而引起了内存泄漏。 声明为static的类不会持有外部类的引用,如果你想使用外部类的话,可以通过软引用的方式保存外部类的引用。
注意:外部类拥有对内部类中所有元素的访问权限的,包括private修饰。原因是:编译器一手操办的
总结:
1:内部类拥有对外部类所有元素直接访问的权限,同理外部类也拥有内部类所有元素访问的权限(前提是必须获取到内部类对象)。因为编译器偷偷的往外部类或内部类中创建了可以访问私有变量的静态方法。
2:外部类中可以创建私有内部类以及声明了私有构造方法的内部类,同理内部类中可以创建声明了私有构造方法的外部类。因为编译器偷偷的往内部类或外部类中创建了包可见构造方法,从而使外部类或内部类获得了访问权限。
3:Java虚拟机其实并不知道内部类这个概念,编译器会把内部类抽离成一个带有$名称的普通类,并对其内部类和外部类,添加相应的构造方法、静态方法、成员变量,而这些元素让外部类和内部类建立起了联系