Java 静态块中不允许使用公共修饰符?

Java 静态块中不允许使用公共修饰符?,java,Java,我有这个: public class Models { public static class User extends BaseModel { public static { public final TableField ID = new TableField("user_id", "userId"); public final TableField HANDLE = new TableField("user_handle", "userHand

我有这个:

public class Models {

  public static class User extends BaseModel {


    public static {

      public final TableField ID = new TableField("user_id", "userId");

      public final TableField HANDLE = new TableField("user_handle", "userHandle");

      public final TableField EMAIL = new TableField("user_email", "userEmail");

    }

  }

}
java说,公共static{}块中的static前面或final前面都不允许public作为修饰符。有人知道为什么吗?也许我不明白静态块与将所有3个字段声明为公共最终静态块有何不同

这就是我所看到的:

还有这个

public作为访问修饰符,不能应用于代码块,也不能应用于代码块内的局部变量

似乎您只想声明静态最终字段:

...
public static final TableField ID = new TableField("user_id", "userId");
...

无需使用静态块。

关于此静态块是什么存在混淆。这些称为初始值设定项块,或者在本例中称为静态初始值设定项块。对于前者,可以将视为在初始化期间运行的构造函数代码的扩展。在后一种情况下,它们在类的静态初始化期间运行,即第一次访问该类时

public class FoobarJNI {
    static {
        System.loadLibrary("foobar"); 
    }

    private native void foo();
    private native void bar();
}
这些块对于设置可能需要多行执行的字段或设置外部资源非常有用

public class Foobar {
    final static int FOO;
    // runs when first loading Foobar.class
    static {
        int i = 1;
        i += 2;
        FOO = i;
    }
    final int bar;
    // runs when first initializing new Foobar()
    {
        int j = 3;
        j += 4;
        bar = i;
    }
}
一般来说,它们不是很常见,但它们特别有用的一点是用于绑定本机JNI库。例如,此方法确保在访问类之前加载foobar.dll

public class FoobarJNI {
    static {
        System.loadLibrary("foobar"); 
    }

    private native void foo();
    private native void bar();
}

是的,我误解了什么是静态块。是的,我想为了向后兼容,他们不想引入另一个关键字,所以他们重用了静态块——但理想情况下,应该使用不同的关键字keyword@AlexanderMills不太清楚你在这里是什么意思?static放在前面,以区分普通实例初始值设定项块与静态上下文。ie类Foo{static{…}}vs只是类Foo{{…}。与其他语言相比,初始化程序块是Java非常独特的功能,因此我可以看出它看起来有多么笨拙。静态关键字和final关键字用于多个上下文,因此,用户会感到困惑。我想说的是,他们不应该使用静态{},而应该使用不同的关键字,例如initialize{},不确定我第一次说的时候你怎么没有得到,但是nbd@AlexanderMills啊,我现在明白你的意思了。不将say initialize添加为关键字以避免编译遗留代码的问题。顺便说一下,如果您确实使用了初始化程序块,您应该仔细阅读它们。有一些陷阱,特别是对于静态情况,可能会使代码的行为有些意外。本教程看起来对您很有用