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

Java 静态初始值设定项vs实例初始值设定项vs构造函数,java,constructor,static,initializer,Java,Constructor,Static,Initializer,我正在准备一个关于Java的考试。在我学习的过程中,我遇到了我不熟悉的java语法。例如花括号({})在没有名称的类主体旁边,有些有静态关键字。我发现他们被称为“初始化者”。谁能帮我指出它们之间的主要区别,以及它们与构造函数的区别。谢谢它们之间的主要区别在于它们的执行顺序。为了说明这一点,我将用一个例子来解释: public class SomeTest { static int staticVariable; int instanceVariable;

我正在准备一个关于Java的考试。在我学习的过程中,我遇到了我不熟悉的java语法。例如花括号({})在没有名称的类主体旁边,有些有静态关键字。我发现他们被称为“初始化者”。谁能帮我指出它们之间的主要区别,以及它们与构造函数的区别。谢谢

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

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加载类后运行
  • 每次实例化对象时,实例初始化块都会在构造函数之前运行
  • 构造函数(显然)在每次实例化对象时运行

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

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


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

这是你真正需要在教科书中找到答案的事情。不过我可以给你一些建议。我编程Java已经有几年了,所以我给你的任何信息都是一般性的


通常,带有花括号的无名块是匿名函数。静态初始值设定项初始化该类的所有实例的全局数据,并在第一次引用该类时运行。您需要注意如何使用静态属性或方法。有了这些信息,你可以在课本中找到准确的细节

我向你推荐这本书的第三章和第三章4@Reieus他还询问了匿名代码块这是一个很好的答案。但我想补充一点,构造函数比实例初始化器更常见。我认为实例初始值设定项的主要用途是在匿名内部类中进行初始化,而匿名内部类不能有构造函数,因为它们缺少名称