假设我们有一个类Test
,就像这样,
public class Test {
public static void main(String... args) {
}
public static class InnerTest {
public void test() {
}
}
}
我同意,我应该使用类名访问静态字段,例如
Test.main();
Test.InnerTest obj = new Test.InnerTest();
但我们也可以通过实例访问静态成员
Test test = new Test();
test.main(); // Compiler warning but WORKS fine.
// But I can't do any of this.
Test.InnerTest itest = test.new InnerTest(); // Illegal enclosing instance specification for type Test.InnerTest
Test.InnerTest itest = new test.InnerTest(); // test cannot be resolved to a type
Test.InnerTest itest = test.new Test.InnerTest(); // Cannot allocate the member type Test.InnerTest using its compound name when qualified by an enclosing instance. The member type name is resolved relatively to the qualifying instance type
我只是想知道为什么这样的事情不可能?我无法从报告的错误中完全理解。
答案 0 :(得分:2)
我的猜测:内部课程后来添加了1.1。当内部类被设计时,很明显允许通过实例访问静态成员是一个错误。为现有案例更改此内容为时已晚,但他们可以避免将其添加到新功能中。
答案 1 :(得分:0)
Test.InnerTest itest = test.new InnerTest(); - 对象测试没有方法新
Test.InnerTest itest = new test.InnerTest(); - 新运算符右侧的所有内容都必须使用Type
Test.InnerTest itest = test.new Test.InnerTest(); - 两个评论的组合
真正想要做什么?创建内部类的实例?您在寻找工厂方法吗?
答案 2 :(得分:0)
恕我直言问题是你正试图将它视为一种“调用方法”方式而且与此无关,因为用“new”关键字创建一个新实例是一个完全不同的过程。
“new”关键字的语法在Java Languaje规范中定义,并且后面需要一个类型名称。在静态内部类的情况下,必须相对于父类名构造该标识符。
https://docs.oracle.com/javase/specs/jls/se7/jls7.pdf
只有Java Languaje才能以这种方式工作。