嵌套类是定义在另一个类内部的类。它们可以是:
匿名类示例:
Button b = new Button(); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 按钮点击事件 } });
特点:
内部(非静态)类可以包含静态方法或变量吗?
答案: 不可以,除了常量(static final)。只有静态嵌套类可以拥有静态成员。
示例(错误):
class Outer { class Inner { static int x = 10; // 编译错误! } }
正确方式:
class Outer { static class StaticNested { static int x = 10; // 正确 } }
故事
在Android应用程序中使用内部类作为事件处理器。处理器存储在静态字段中,并保持对Activity的隐式引用,因此在Activity被销毁时发生内存泄漏,应用程序开始"崩溃",直到OutOfMemoryError。
故事
在一个微服务中使用匿名类,这些类引用外部迭代变量。重构后,这些变量不再是有效final,因此代码无法编译——开发人员花了很长时间寻找原因,直到想起这个限制。
故事
在库中使用静态变量在内部类中,以为这是普通的做法。在新版本的JDK中,项目不再编译,因为标准变得更加严格了。急需重新设计架构。