【发布时间】:2015-02-24 16:59:37
【问题描述】:
当我尝试编译以下代码时,出现编译错误:
unexpected type System.out.println( new Test().C.i );
^
required: class,package
found: value
class Test {
class C {
static final int i = 0;
}
public static void main(String... z) {
System.out.println( new Test().C.i );
}
}
但是,如果我将new Test().C.i 更改为new Test().new C().i,它编译就好了。
为什么?如果 i 在 C 中是静态的,那么我不应该实例化 C。我应该能够通过类 C 调用它,而不是 C 对象。
我错过了什么?
【问题讨论】:
-
您不能通过变量访问内部类型(静态或非静态)。如果您创建
Test t = new Test();,那么t.C是不恰当的调用类型C。您只能使用Test.C.i之类的外部类型或使用new来实际创建C的实例,这将让您访问i(我确信有一些Java 语言规范可以解释它,希望有人能找到并发布)。 -
可以通过变量访问静态嵌套类。如果 C 和 i 都是静态的,Test.C.i 就可以正常工作。
-
在
Test.CTest不是变量,而是类型。在我的示例中,t是可变的。 -
今天的问题中,投票最多的获胜者是......
-
啊,你是对的。对不起。