静态和非静态初始化代码块有什么区别

新手上路,请多包涵

我的问题是关于 static 关键字的一种特殊用法。可以使用 static 关键字来覆盖不属于任何函数的类中的代码块。例如下面的代码编译:

 public class Test {
    private static final int a;
    static {
        a = 5;
        doSomething(a);
    }
    private static int doSomething(int x) {
        return (x+5);
    }
}

如果删除 static 关键字,它会抱怨,因为变量 afinal 。但是,可以删除 finalstatic 关键字并使其编译。

这两种方式都让我感到困惑。我怎么会有一个不属于任何方法的代码段?怎么可能调用它?一般来说,这种用法的目的是什么?或者更好的是,我在哪里可以找到有关此的文档?

原文由 Szere Dyeri 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 525
2 个回答

带有 static 修饰符的代码块表示 初始化器;如果没有 static 修饰符,代码块是一个 实例 初始化器。

当类被加载时(实际上,当它被解析时,类初始化器按照它们被定义的顺序执行(自上而下,就像简单的变量初始化器一样)(实际上,当它被解析时,但这是一个技术问题)。

实例初始化器按照类被实例化时定义的顺序执行,紧接在执行构造函数代码之前,紧接在调用超级构造函数之后。

如果从 --- 中删除 static int a ,它就会变成一个实例变量,您无法从静态初始化程序块访问它。这将无法编译并出现错误“无法从静态上下文中引用非静态变量 a”。

如果您还从初始化程序块中删除了 static ,它将成为一个实例初始化程序,因此 int a 在构造时被初始化。

原文由 Lawrence Dol 发布,翻译遵循 CC BY-SA 3.0 许可协议

呸!什么是静态初始化器?

静态初始化程序是 static {} java 类中的代码块,并且仅在调用构造函数或 main 方法之前运行一次。

好的!告诉我更多…

  • 是任何java类中的代码块 static { ... } 。并在调用类时由虚拟机执行。
  • 不支持 return 语句。
  • 不支持任何参数。
  • 不支持 thissuper

嗯,我可以在哪里使用它?

可以在任何您觉得合适的地方使用 :) 就这么简单。但我看到大部分时间它是在进行数据库连接、API 初始化、日志记录等时使用的。

不要只是吠叫!例子在哪里?

 package com.example.learnjava;

import java.util.ArrayList;

public class Fruit {

    static {
        System.out.println("Inside Static Initializer.");

        // fruits array
        ArrayList<String> fruits = new ArrayList<>();
        fruits.add("Apple");
        fruits.add("Orange");
        fruits.add("Pear");

        // print fruits
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
        System.out.println("End Static Initializer.\n");
    }

    public static void main(String[] args) {
        System.out.println("Inside Main Method.");
    }
}

输出???

内部静态初始化程序。

苹果

橙子

结束静态初始化程序。

内部主要方法。

希望这可以帮助!

原文由 Madan Sapkota 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题