java - 为什么不能在内部类中为静态变量使用初始化程序 block ?

标签 java static declaration inner-classes

<分区>

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

在下面的代码中,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, Section 8.1.3 , 不允许这种行为。

It is a compile-time error if an inner class declares a static initializer (§8.7).

It is a compile-time error if an inner class declares a member that is explicitly or implicitly static, unless the member is a constant variable (§4.12.4).

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

关于java - 为什么不能在内部类中为静态变量使用初始化程序 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32725511/

相关文章:

c++ - 内联函数中的静态变量

java - 如何使用Gradle添加 “jdbc”插件

java - 通过派生类访问Java中定义的静态内部类

java - jSoup 从 <td><span> 类获取文本

spring - 多模块 GWT 2.4.0 - Spring 3.1.1 应用程序中的静态资源

c++ - 歧义消解

java - 为什么在这个树遍历中只有 log(N) 次递归调用?

python - 为 Web 应用程序保留几乎静态数据的最佳方法是什么?

c - 声明还是定义?

C++声明许多相似的类而不重复自己