为什么不能在内部类中使用初始化块作为静态变量?

acu*_*ner 6 java static declaration inner-classes

为什么java不允许在非静态内部类中使用静态初始化块进行静态声明?

在下面的代码中,尽管做了同样的事情,outer2将工作,而inner2将不会.有任何想法吗?我不是在寻找一种解决方法,我只是想了解为什么java无法做到这一点.

public class WhyUNoStatic {
    public static final String outer1 = "snth";  // ok
    public static final String outer2;  // ok
    static
    {
        outer2 = "snth";
    }

    public class Inner {
        public static final String inner1 = "snth";  // still ok! 
        public static final String inner2;  // FAILURE TIME
        static
        {
            inner2 = "snth";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,这inner1将正常工作.并不是java禁止内部类中的静态变量,它只是禁止声明它们.

rge*_*man 2

JLS第 8.1.3 节不允许这种行为。

\n
\n

如果内部类声明静态初始值设定项 (\xc2\xa78.7),则会出现编译时错误。

\n

如果内部类声明显式或隐式静态的成员,则会出现编译时错误,除非该成员是常量变量 (\xc2\xa74.12.4)。

\n
\n

您在内部类中声明了static变量final,这是可以的,但是静态初始化器在那里是被禁止的。

\n