为什么我无法通过实例访问静态内部类

时间:2015-08-20 12:48:56

标签: java inner-classes static-members

假设我们有一个类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

我只是想知道为什么这样的事情不可能?我无法从报告的错误中完全理解。

3 个答案:

答案 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才能以这种方式工作。