为什么我不能通过实例访问静态内部类



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

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

我的猜测:内部类是后来在1.1中添加的。在设计内部类的时候,很明显允许通过实例访问静态成员是一个错误。对现有的情况进行修改已经太晚了,但他们可以避免为新功能添加它。

测试。InnerTest = test。新InnerTest ();-对象测试没有new方法

测试。InnerTest = new test.InnerTest();- new操作符右侧的所有内容必须是Type

测试。InnerTest = test。新Test.InnerTest ();-两个注释的组合

你到底想做什么?创建内部类的实例?您在寻找工厂方法吗?

IMHO问题是你正试图将其视为一种"调用方法"的方式,它与此无关,因为用"new"关键字创建一个新实例是一个完全不同的过程。

"new"关键字的语法是在Java语言规范中定义的,它需要一个类型名称。在静态内部类的情况下,这个标识符必须相对于父类名来构造。

https://docs.oracle.com/javase/specs/jls/se7/jls7.pdf

最新更新