静态初始值设定项与实例初始值设定项与构造函数

2022-09-04 06:22:16

我正在学习一门关于Java的考试。在我学习的时候,我遇到了java中我不熟悉的语法。例如,大括号({})在没有名称的类体旁边,有些具有静态关键字。我发现它们被称为“初始值设定项”。任何人都可以帮我指出它们之间的关键区别以及它们与构造函数的区别。谢谢


答案 1

它们之间的主要区别在于它们的执行顺序。为了说明这一点,我将用一个例子来解释它们:

public class SomeTest {

    static int staticVariable;
    int instanceVariable;        

    // Static initialization block:
    static {
        System.out.println("Static initialization.");
        staticVariable = 5;
    }

    // Instance initialization block:
    {
        System.out.println("Instance initialization.");
        instanceVariable = 10;
    }

    // Constructor
    public SomeTest() {
        System.out.println("Constructor executed.");
    }

    public static void main(String[] args) {
        new SomeTest();
        new SomeTest();
    }
}

输出将为:

Static initalization.
Instance initialization.
Constructor executed.
Instance initialization.
Constructor executed.

简单谈谈:

  • 静态初始化块在 JVM 装入类后运行。
  • 每次实例化对象时,实例初始化块都会在构造函数之前运行。
  • 构造函数(显然)在每次实例化对象时运行。

答案 2

构造函数在创建类的新实例时调用一次。构造函数中初始化的值属于实例的作用域。对于在构造函数中初始化的同一字段,每个实例可能具有不同的值。

静态初始值设定项对于在静态类中执行安装代码以及在枚举中填充数据结构非常有用。当类加载到 JVM 中并且数据存在于类或枚举的范围内时,它们将按从上到下的顺序调用一次。对类的所有引用将为静态初始值设定项中初始化的字段返回相同的值

未命名的大括号是作用域引用名称的匿名代码块。如果在块内创建引用,则无法在块外部获取该引用的值。如果你发现自己需要它们,这表明你需要将代码重构为更多的方法。


推荐