class Outer {
class Inner {
}
}
public class Demo {
public static void main(String args[]) {
Outer o = new Outer();
Outer.Inner inner = o.new Inner();
}
}为什么是
Outer.Inner inner = o.new Inner();不
Outer.Inner inner = o.new Outer.Inner();也就是说,为什么用外部类名限定inner的类型声明,而不用外部类名限定内部类的构造函数?
谢谢。
发布于 2019-05-22 19:48:43
在JLS 15.9中,您讨论的是一个限定类实例创建表达式。
限定类实例创建表达式以一个新的
Primary表达式或一个ExpressionName开始
(您的表达式以主表达式开头)
语法如下:
ClassInstanceCreationExpression: UnqualifiedClassInstanceCreationExpression ExpressionName .UnqualifiedClassInstanceCreationExpression小学UnqualifiedClassInstanceCreationExpression UnqualifiedClassInstanceCreationExpression: new TypeArguments ClassOrInterfaceTypeToInstantiate ( ArgumentList ) ClassBody ClassOrInterfaceTypeToInstantiate:{注释}标识符{.{注释}标识符} TypeArgumentsOrDiamond TypeArgumentsOrDiamond: TypeArguments <>
稍低一点,在15.9.1,它说:
Identifier在ClassOrInterfaceTypeToInstantiate中必须明确表示可访问的、非最终的、非枚举类型的内部类,以及Primary表达式或ExpressionName编译时类型的成员。否则,会发生编译时错误.
因此,它必须是表达式类型的成员。因此,没有必要对其进行限定,因为它只能是Outer中的一个类。
必须指定Outer.是多余的。
发布于 2019-05-22 19:38:47
因为o已经是一个Outer类型的实例,所以您不需要创建另一个Outer实例来创建Inner实例。您所列出的第二个选项意味着您要在顶级Outer中创建另一个名为Outer的内部类的实例,而这个实例并不存在,它将给出一个错误。(编辑:刚刚注意到o.new Outer后面没有括号,这让我觉得你可能有我的第二段的推理)。
如果您的意思是Outer.Inner()应该是构造函数,而不仅仅是Inner(),那是因为Outer.Inner()意味着Inner是一个静态的内部类。从未指定过static,因此您需要一个Outer实例。
发布于 2019-05-22 19:38:08
供比较:
public class Demo {
public static void foo(){
System.out.println("Hello world!");
}
}我们可以通过两种方式foo:
1)
Demo.foo(); // with Demo qualifier2)
Demo d = new Demo();
d.foo(); // without Demo qualifier!https://stackoverflow.com/questions/56263745
复制相似问题