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

时间:2019-02-16 02:37:06

标签: 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", "userHandle");

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

    }

  }

}

java表示,不允许在public public {}块中的static之前或final的前面将public用作修饰符。有人知道为什么吗?也许我不了解静态块与将所有3个字段都声明为public final static有何不同。

这是我看到的:

enter image description here

还有这个

enter image description here

2 个答案:

答案 0 :(得分:4)

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

似乎您只想声明静态的final字段:

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

无需为此使用static块。

答案 1 :(得分:2)

这个“静态块”是什么让人困惑。这些称为initializer blocks,在本例中为static initializer block。对于前者,可以将其视为初始化期间运行的构造函数代码的扩展。在后一种情况下,它们在类的静态初始化期间运行(即,第一次访问类)。

这些块对于设置可能需要多行才能执行的字段或设置外部资源很有用。

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();
}