创建内部类的Java语法的起源是什么?

12

我对在Java中使用外部类实例化内部类的语法选择感到好奇。

语法如下:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

但为什么不是这样呢:

OuterClass.InnerClass innerObject = new outerObject.InnerClass(); 

前者似乎暗示了new是与类直接关联的方法或运算符,但我的理解是这不是情况(不像C++)?

3个回答

9
后者意味着对我来说类型名称是outerObject.InnerClass,而实际上类型名称只是InnerClass(或OuterClass.InnerClass,这也是合法的),构造时与outerObject引用的实例相关联。

个人认为Java嵌套类的方式不太好,我同意它看起来有点奇怪,但我能理解为什么要这样做。


3
还有另一个原因。
new o.C(); 

内部类有两种可能的含义。它可能意味着在外部对象o的上下文中创建一个内部类C。它也可能是创建一个完全限定名称为o.C的类。这种歧义是有问题的,特别是因为两种解释在同一时间都是有效的。


1

内部类是外部类的子集,以所有方式都是外部类的固有部分。内部类可以访问外部类的所有成员,就像它们是一个整体一样。同样,(非static)内部类的实例必须是外部类实例的固有部分。它不能独立存在。您可以将其与如何使用 MyClass.wyVariable 访问非静态变量或函数进行比较。

这引出了哪种方式是最语义正确地表示此关系的问题。

OuterClass.InnerClass innerObject = new outerObject.InnerClass();

...(从语义上)表明 InnerClassouterObject 的某种属性,一旦获取到,就可以在 outerObject 的作用域之外自由处理。 在这种情况下,new 没有什么特别的。

相反,InnerClassOuterClass 的一部分,而 InnerClass 的实例必须是 OuterClass 的实例的一部分。

上面的语法将象征着 InnerClass(类本身)是 OuterClass 的某个实例的一部分,这在语义上是不正确的。 毕竟,只有一个 InnerClass 类,即使该类可以有任意数量的实例。

OuterClass.InnerClass innerObject = new OuterClass.InnerClass();

......对于非static内部类来说,这当然也是(语义上)不正确的,因为它根本不能代表内部类实例和外部类之间特殊的亲密关系。

但请注意,对于static内部类来说,这种语法是完全可以接受的,因为它们与外部类的任何一个实例都没有特殊的关系。在其外部类中实例化内部类时,这种语法也是完全可以接受的。

最后,

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

...更好地象征了这种关系。它象征着实例化过程与一个特定的外部对象紧密相连,这是事实。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接