我对在Java中使用外部类实例化内部类的语法选择感到好奇。
语法如下:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
但为什么不是这样呢:
OuterClass.InnerClass innerObject = new outerObject.InnerClass();
前者似乎暗示了new是与类直接关联的方法或运算符,但我的理解是这不是情况(不像C++)?
我对在Java中使用外部类实例化内部类的语法选择感到好奇。
语法如下:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
但为什么不是这样呢:
OuterClass.InnerClass innerObject = new outerObject.InnerClass();
前者似乎暗示了new是与类直接关联的方法或运算符,但我的理解是这不是情况(不像C++)?
outerObject.InnerClass
,而实际上类型名称只是InnerClass
(或OuterClass.InnerClass
,这也是合法的),构造时与outerObject
引用的实例相关联。
个人认为Java嵌套类的方式不太好,我同意它看起来有点奇怪,但我能理解为什么要这样做。
new o.C();
内部类
有两种可能的含义。它可能意味着在外部对象o
的上下文中创建一个内部类C
。它也可能是创建一个完全限定名称为o.C
的类。这种歧义是有问题的,特别是因为两种解释在同一时间都是有效的。
内部类是外部类的子集,以所有方式都是外部类的固有部分。内部类可以访问外部类的所有成员,就像它们是一个整体一样。同样,(非static
)内部类的实例必须是外部类实例的固有部分。它不能独立存在。您可以将其与如何使用 MyClass.wyVariable
访问非静态变量或函数进行比较。
这引出了哪种方式是最语义正确地表示此关系的问题。
OuterClass.InnerClass innerObject = new outerObject.InnerClass();
...(从语义上)表明 InnerClass
是 outerObject
的某种属性,一旦获取到,就可以在 outerObject
的作用域之外自由处理。 在这种情况下,new
没有什么特别的。
相反,InnerClass
是 OuterClass
的一部分,而 InnerClass 的实例必须是 OuterClass 的实例的一部分。
上面的语法将象征着 InnerClass
(类本身)是 OuterClass
的某个实例的一部分,这在语义上是不正确的。 毕竟,只有一个 InnerClass
类,即使该类可以有任意数量的实例。
OuterClass.InnerClass innerObject = new OuterClass.InnerClass();
......对于非static
内部类来说,这当然也是(语义上)不正确的,因为它根本不能代表内部类实例和外部类之间特殊的亲密关系。
但请注意,对于static
内部类来说,这种语法是完全可以接受的,因为它们与外部类的任何一个实例都没有特殊的关系。在其外部类中实例化内部类时,这种语法也是完全可以接受的。
最后,
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
...更好地象征了这种关系。它象征着实例化过程与一个特定的外部对象紧密相连,这是事实。