java - 每个内部类都需要一个封闭实例是真的吗?

标签 java class jls

inner class这个词通常被认为是“一个需要封闭实例的嵌套类”。但是,JLS 声明如下:

8.1.3. Inner Classes and Enclosing Instances

[...]

Inner classes include local (§14.3), anonymous (§15.9.5) and non-static member classes (§8.5).

[...]

An instance of an inner class whose declaration occurs in a static context has no lexically enclosing instances.

还有,

15.9.5. Anonymous Class Declarations

[...]

An anonymous class is always an inner class (§8.1.3); it is never static (§8.1.1, §8.5.1).

众所周知,匿名类可以在静态上下文中声明:

class A {
  int t() { return 1; }
  static A a =  new A() { int t() { return 2; } };
}

用辛酸来形容,

new A() {} 是一个没有封闭实例的嵌套类,在静态上下文中定义,但它不是静态嵌套类——它是一个内部类。

在日常使用中,我们是否都给这些术语赋予了不恰当的含义?

作为相关的兴趣点,this historical specification document将术语 top-level 定义为 inner 的对立面:

Classes which are static class members and classes which are package members are both called top-level classes. They differ from inner classes in that a top-level class can make direct use only of its own instance variables.

而在常见用法中,top-level 被视为与 nested 相反。

最佳答案

从规范的角度来看,问题中列出的区别非常合理:

  • 内部类有限制,这与封闭实例的问题无关(例如,它可能没有静态成员);

  • 静态嵌套类的概念基本上就是命名空间;这些类可能与我们通常认为的顶级类一起被称为顶级

碰巧从嵌套类声明中删除 static 会同时做两件不同的事情:

  1. 它使类需要一个封闭的实例;
  2. 它使类内部

我们很少将 inner 视为包含限制;我们只关注 enclosure instance 关注点,它更加明显。但是,从规范的角度来看,这些限制是一个至关重要的问题。

我们缺少的是需要封闭实例的类的术语。 JLS 没有定义这样的术语,所以我们(似乎不知道)劫持了一个相关但实际上本质上不同的术语来表示这个。

关于java - 每个内部类都需要一个封闭实例是真的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20468856/

相关文章:

java - 使用 PostgreSQL COPY JDBC 防止 SQL 注入(inject)

java - 开发jax-rs应用程序时如何处理accept-parameters

java - 通过创建不同的对象来使用相同的 AsyncTask

ruby - 向 Rails 3 中的延迟作业添加一些自定义方法?

java - 如何在文本 block 中处理意图(Java 13)

java - 如何打开 .apk 文件

c++ - C++ 类中的构造函数

java - 使用 makefile 无法找到或加载主类

java - Java Janguage 规范的澄清

java - 关于在对象的构造函数完成之前引用对象