为了账号安全,请及时绑定邮箱和手机立即绑定

静态初始化块

静态初始化块

慕哥6287543 2019-06-17 16:57:28
静态初始化块据我所知,“静态初始化块”用于在一行中设置静态字段的值。但是我不明白为什么我们需要一个特殊的障碍来解决这个问题。例如,我们将一个字段声明为静态字段(没有值赋值)。然后编写代码中的几行代码,生成并为上述声明的静态字段赋值。为什么我们需要在一个特殊的块中使用这一行,比如:static {...}?
查看完整描述

3 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

这个非静态块:

{
    // Do Something...}

获取调用每次构造类的一个实例。这个静态块只会被调用一次,当类本身被初始化时,不管您创建了多少个该类型的对象。

例子:

public class Test {

    static{
        System.out.println("Static");
    }

    {
        System.out.println("Non-static block");
    }

    public static void main(String[] args) {
        Test t = new Test();
        Test t2 = new Test();
    }}

这些指纹:

StaticNon-static blockNon-static block


查看完整回答
反对 回复 2019-06-17
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

如果它们不在静态初始化块中,那么它们会在哪里?您将如何声明仅用于初始化目的本地变量,并将其与字段区分开来?例如,如何你,你们想写:

public class Foo {
    private static final int widgets;

    static {
        int first = Widgets.getFirstCount();
        int second = Widgets.getSecondCount();
        // Imagine more complex logic here which really used first/second
        widgets = first + second;
    }}

如果firstsecond不是在街区里,它们看起来就像田野。如果他们在一个街区里static在它前面,这将被算作一个实例初始化块,而不是一个静态初始化块,因此它将被执行一次。构造实例,而不是总计一次。

现在,在这种特殊情况下,您可以使用静态方法来代替:

public class Foo {
    private static final int widgets = getWidgets();

    static int getWidgets() {
        int first = Widgets.getFirstCount();
        int second = Widgets.getSecondCount();
        // Imagine more complex logic here which really used first/second
        return first + second;
    }}

..但是,如果您希望在同一个块中分配多个变量,或者没有变量(例如,如果您只想记录某项内容-或者可能初始化一个本机库),这是行不通的。


查看完整回答
反对 回复 2019-06-17
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

下面是一个例子:

  private static final HashMap<String, String> MAP = new HashMap<String, String>();
  static {
    MAP.put("banana", "honey");
    MAP.put("peanut butter", "jelly");
    MAP.put("rice", "beans");
  }

“静态”部分中的代码将在类加载时、类的任何实例被构造之前(以及在从其他地方调用任何静态方法之前)执行。这样,您就可以确保类资源都可以使用了。

也有可能有非静态初始化块。它们类似于为类定义的构造函数方法集的扩展。它们看起来就像静态初始化程序块,除非关键字“静态”被关闭。


查看完整回答
反对 回复 2019-06-17
  • 3 回答
  • 0 关注
  • 461 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号