编程Java开发者

谈谈在Java中使用匿名类和嵌套类的关键特性,以及使用它们时的潜在问题。

用 Hintsage AI 助手通过面试

答案。

嵌套类是定义在另一个类内部的类。它们可以是:

  • 静态嵌套类 — 静态嵌套类;在没有外部类实例的情况下,无法访问外部类的非静态成员。
  • 内部类 — 非静态嵌套类;可以访问外部类的所有成员。
  • 匿名类 — 没有名称的内部类,通常在使用位置声明和创建,通常在处理接口/抽象类时使用。

匿名类示例:

Button b = new Button(); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 按钮点击事件 } });

特点:

  • 匿名类只能访问外部作用域的final(有效final)变量。
  • 每个内部类的实例隐式地保存对外部类实例的引用。
  • 根据类型(静态/内部),可能会发生内存泄漏或意外依赖。

有陷阱的问题。

内部(非静态)类可以包含静态方法或变量吗?

答案: 不可以,除了常量(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中,项目不再编译,因为标准变得更加严格了。急需重新设计架构。