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



为什么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";
        }
    }
}

编辑:注意,inner1将工作良好。Java并不是禁止在内部类中使用静态变量,而是禁止声明静态变量。

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

如果内部类声明了静态初始化式(§8.7),则会导致编译时错误。

如果内部类声明了显式或隐式静态成员,除非该成员是常量变量(第4.12.4节),否则会导致编译时错误。

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

参见JLS Chapter 8

内部类不能声明静态初始化器(第8.7节)或成员接口,否则会发生编译时错误。

你可以声明一个嵌套类

public static class Inner {...}

最新更新