静态初始化程序与实例初始化程序与构造函数

时间:2014-02-21 01:16:32

标签: java constructor static initializer

我正在攻读有关Java的考试。在我学习的时候,我遇到了java中我不熟悉的语法。例如花括号({})取消了没有名称的类主体,有些具有静态关键字。我发现它们被称为“初始化器”。任何人都可以帮我指出它们之间的主要差异以及它们与构造函数的区别。感谢

3 个答案:

答案 0 :(得分:25)

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

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

答案 1 :(得分:1)

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

静态初始化程序对于在静态类中执行设置代码和在枚举中填写数据结构非常有用。当Class加载到JVM中并且数据存在于Class或Enum的范围内时,它们按从上到下的顺序调用一次。对Class的所有引用都将为Static Initializers

中初始化的字段返回相同的值

未命名的Curly Braces是范围引用名称的匿名代码块。如果在块内创建引用,则无法在块外获取该引用的值。如果您发现自己需要它们,那么您需要将代码重构为更多方法。

答案 2 :(得分:-2)

这是你真正需要在教科书中寻找答案的东西。不过我可以给你一些指示。自从我编写Java以来​​已经有好几年了,所以我给你的任何信息都是通用的。

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