3 回答

TA贡献1802条经验 获得超4个赞
您不能将变量名称用作另一个变量的类型,而这正是您想要使用的objOut.Inner
。变量的类型是Inner
(或可选Outer.Inner
)。
因为Inner
是一个内部类,所以它与其外部类的实例(其封闭实例)相关联。当您创建它的实例时,您可以选择指定与它关联的对象实例,这就是您正在使用objOut.new Inner
.
这个例子可能会让它更清楚一些:
public class Example {
private String str;
public class Inner {
void show() {
// Show the string for the Example this Inner is part of
System.out.println(Example.this.str);
}
}
public Example(String s) {
this.str = s;
}
public static void main(String[] args) {
Example e1 = new Example("e1");
Example e2 = new Example("e2");
Inner i1 = e1.new Inner();
i1.show(); // "e1"
Inner i2 = e2.new Inner();
i2.show(); // "e2"
}
}
请注意该i1
Inner
实例如何获取e1
其封闭Example
实例,因此看到e1
s str
,但又如何i2
获取e2
其封闭实例,因此它看到e2
s str
。
有时候它不是可选的,例如在我Example
上面的类中,因为new Inner
使用了 where ,所以没有可以使用的默认实例。它在 的实例方法中是可选的Example
,但在该static
方法中不是可选的。

TA贡献1784条经验 获得超2个赞
两者都不能编译。
为了使前者编译,应该声明一个变量,并给出该变量的名称。
Outer.Inner obj = objOut.new Inner();
即使您执行此步骤,后者也不会编译,因为它既objOut.Inner
不是类型(因为主表达式objOut
不是类型)也不是有效名称(因为在标识符 (jls-3.8).
中不允许使用)。
针对您的情况的简化规则(jls-14.4)是
LocalVariableType VariableDeclaratorId [= VariableInitializer];

TA贡献1827条经验 获得超4个赞
这个 :
Outer.Inner = objOut.new Inner();
不会编译,但如果你将其更改为:
Outer.Inner object = objOut.new Inner();
将意味着创建一个引用类的内部类实例Outer
-objOut
将是Outer
类的实例。
还有这个:
objOut.Inner = objOut.new Inner();
不会编译,因为objOut
该类的实例Outer
没有 poperty Inner
。
并不是Outer
类知道类的实例Inner
,而是Inner
类实例知道Outer
创建它的类实例。
编辑
该行:
objOut.Inner object2= objOut.new Inner();
将无法编译,因为Inner
类型标识符属于Outer
类而不是此类的实例。
添加回答
举报