【问题标题】:Static Initializers vs Instance Initializers vs Constructors [duplicate]静态初始化器与实例初始化器与构造器[重复]
【发布时间】:2014-03-22 07:24:40
【问题描述】:

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

【问题讨论】:

标签: java constructor static initializer


【解决方案1】:

这是您真正需要在教科书中查看才能获得答案的内容。不过我可以给你一些指点。自从我编写 Java 以来已经有好几年了,所以我给你的任何信息都是一般性的。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    【解决方案3】:

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

    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
    猜你喜欢
    • 2015-05-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多