Java编译器错误拼图器:";内部类不能有静态声明";-除了简单的类型

Java编译器错误拼图器:";内部类不能有静态声明";-除了简单的类型,java,compiler-construction,compiler-errors,Java,Compiler Construction,Compiler Errors,在编写代码时,我遇到了一种奇怪的Java编译器行为 编译类(下面的源代码)时,编译器会在NULL类变量上发出错误(“内部类不能有静态声明””)。这是意料之中的事 但是,零类变量上不会生成错误。这我不明白 为什么会有这种差异,它似乎允许在内部类中使用简单类型的静态声明,但不允许使用对象 (javac-版本:1.6.0_24) 问题是内部类不能有一个静态初始化器块,初始化非平凡常量和非常量需要它。我认为这是因为priomitive变量将被视为常量并进行内联编译,而对象引用则不会。我记得在这段YouT

在编写代码时,我遇到了一种奇怪的Java编译器行为

编译类(下面的源代码)时,编译器会在NULL类变量上发出错误(“
内部类不能有静态声明”
”)。这是意料之中的事

但是,零类变量上不会生成错误。这我不明白

为什么会有这种差异,它似乎允许在内部类中使用简单类型的静态声明,但不允许使用对象

(javac-版本:1.6.0_24)


问题是内部类不能有一个静态初始化器块,初始化非平凡常量和非常量需要它。

我认为这是因为priomitive变量将被视为常量并进行内联编译,而
对象
引用则不会。我记得在这段YouTube视频中看到编译器如何处理带有
null
引用的常量:无论是null引用还是“new Object()”引用都没有区别,都会导致编译器错误。+1;有人可能会说错误信息不是很明确。第一个声明也是静态的。也不知道为什么内部类不能有静态初始化程序块|如果内部类不能有静态初始值设定项块,为什么可以初始化静态简单类型类变量?Java语言规范的哪一部分允许一个而不允许另一个。我实际上认为真正的问题是没有为简单类型类变量(静态字段)生成编译器错误。简单原语字段在字节码中有一个默认值,它们不需要静态块来初始化。好的,接受。因此(正如maba正确指出的那样),编译器错误“内部类不能有静态声明”严格来说是错误的(或者说是误导性的),因为内部类可以有静态声明。错误应该类似于“内部类不能有静态初始值设定项代码”,对吗?
public class Outer {
    public static final Runnable HELLO = new Runnable() {
        // No compiler error
        public static final int ZERO = 0;

        // Causes compiler error: "inner classes cannot have static declarations"
        public static final Object NULL = null;

        @Override
        public void run() {
            System.out.println("Hello " + ZERO + NULL);
        }
    };
}