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添加为关键字以避免编译遗留代码的问题。顺便说一下,如果您确实使用了初始化程序块,您应该仔细阅读它们。有一些陷阱,特别是对于静态情况,可能会使代码的行为有些意外。本教程看起来对您很有用