【问题标题】:When instance variables are initialized in JAVA [duplicate]在JAVA中初始化实例变量时[重复]
【发布时间】:2018-05-11 07:03:06
【问题描述】:

看了stackoverflow上的各种链接,我有这样的理解:

这是否正确:

  • 实例变量在类被实例化时被初始化。
  • 如果实例变量只声明而不初始化,它们 将在构造函数执行之前由 JVM 分配默认值。
  • 如果实例变量是用初始化声明的,那么这些 行将在我的类的每个构造函数中移动。因此, 编译器会在构造函数中执行。

谢谢。

【问题讨论】:

  • 您可以在 Java 语言规范第 12.5 节中找到所有步骤。该语言可能有点技术性,但它是权威的来源。你上面写的很接近,但并不完全正确。例如,实例变量总是首先被赋予它们的默认值,不管它们是否有初始化器。对于 Java 8:docs.oracle.com/javase/specs/jls/se10/html/jls-12.html#jls-12.5
  • 我从上面的链接了解到以下执行流程: 1. 内存分配(假设所需内存由 JVM 计算) 2. JVM 分配给相应实例变量的默认值 3. 构造函数执行(第一行) 4. 实例初始化程序执行(假设构造函数执行已停止) 5. 剩余的构造函数执行。还不清楚在声明时初始化的变量何时执行?
  • 另外,现在下面的答案说,“我可以说声明时的初始化是由编译器在构造函数执行之前完成的”。让我更加困惑
  • 在第 4 步中完成:为此类执行实例初始化程序和 实例变量初始化程序
  • 谢谢,最后一件事:编译器是否在幕后移动了构造函数中的实例变量初始化器?还是人们只是为了更好地理解而这么说。这是因为:编译器在第一行之后停止(递归调用 super() 或 this())以运行实例变量初始化程序(未移动到构造函数),然后执行剩余的构造函数代码?

标签: java oop


【解决方案1】:

实例变量属于一个类的对象,所以当一个类的对象被创建时,实例变量在每个对象的创建过程中获得单独的内存。

【讨论】:

    【解决方案2】:

    以下是初始化实例变量的可能方法及其顺序:

    class MyClass {
        private int var1 = 1;
        private int var2;
        {
            var2 = 2;
        }
    
        private int var3;
    
        public MyClass() {
            var3 = 3;
        }
    }
    

    您对默认值是正确的(例如,int 为 0,booleanfalse,对象为 null)。

    你不能真的说声明时的初始化被“移到我的类的构造函数中”;例如,如果声明中的初始化引发异常,则会导致 ExceptionInInitializerError,这是您无法(即不应该)捕获的。

    【讨论】:

    • 那么我可以说声明时的初始化是在构造函数执行之前由编译器完成的吗?
    • @abubakr 是的,你可以。
    • @abubakr 不,你不能。
    • @ErwinBolwidt 我觉得用另一种方式表述它很奇怪(除非我误解了实际过程)。
    猜你喜欢
    • 2013-08-14
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2012-09-17
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多