请定义 Java 内部类,说明其分类方式,并阐述内部类的优点和典型应用场景。
考察说明
考查对 Java 内部类概念、分类及典型应用的掌握程度。
回答思路
- 【回答框架 1】内部类是定义在另一个类或接口内部的类。核心特征包括:与外部类共享访问权限(可直接访问外部类私有成员),编译后生成独立的 class 文件,且静态成员规则受限(非静态内部类不能定义静态成员)。
- 【回答框架 2】按定义位置和修饰符分类:成员内部类(实例内部类)、静态内部类(静态嵌套类)、局部内部类、匿名内部类。成员内部类持有外部类引用,静态内部类不持有;局部内部类在方法内定义,匿名内部类没有类名且用于简化接口或抽象类的实现。
- 【回答框架 3】优点:实现更好的封装(隐藏实现细节)、代码组织更紧凑、方便访问外部类成员、回调实现(匿名内部类)等。常见场景:事件监听器、迭代器实现(如 ArrayList 的 Itr)、线程 Runnable 实现、实现 Builder 模式时使用静态内部类。
- 【回答框架 4】生产实践中,非静态内部类持有外部类引用易导致内存泄漏(如 Handler 持有 Activity),建议使用静态内部类加弱引用;同时优先考虑使用 Lambda 或函数式接口替代匿名内部类以降低样板代码。
- 【关键点 1】内部类直接访问外部类私有成员,包括私有字段和方法;编译产物为 OutClass$InnerClass.class。
- 【关键点 2】分类:成员内部类、静态内部类、局部内部类、匿名内部类;静态内部类不持有外部类引用。
- 【关键点 3】成员内部类不能定义静态成员(静态常量除外),且创建实例依赖外部类实例。
- 【关键点 4】典型应用:事件监听、迭代器、线程实现、Builder模式;内存敏感场景应避免非静态内部类隐式持有外部类引用。
- 【易错点 1】非静态内部类隐式持有外部类引用,长期存活可能导致外部类无法被回收,应使用静态内部类或弱引用。
- 【易错点 2】局部内部类和匿名内部类在 Java 8 之前的版本要求访问的局部变量必须为 final;Java 8 后实际不可变也可。
- 【易错点 3】混淆静态内部类与内部类的区别,误认为所有内部类都需要外部类实例才能创建。