Java 构造函数初始化变量

Java 构造函数初始化变量,java,Java,关于变量x3,哪个构造函数初始化它?我似乎不明白。它会是类X的无参数构造函数吗?或者可能是对象类的默认构造函数 class X { int x1, x2, x3; } x3是一个实例变量,它的默认值为0(对于int)。来自Java文档: 声明字段时并不总是需要赋值。声明为但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值将为零或null,具体取决于数据类型 然而,依赖这些默认值通常被认为是糟糕的编程风格。 如果它是一个局部变量(例如在方法中创建的变量),则必须对其进行初始

关于变量x3,哪个构造函数初始化它?我似乎不明白。它会是类X的无参数构造函数吗?或者可能是对象类的默认构造函数

class X {
    int x1, x2, x3;
}

x3
是一个实例变量,它的默认值为0(对于int)。来自Java文档:

声明字段时并不总是需要赋值。声明为但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值将为零或null,具体取决于数据类型

然而,依赖这些默认值通常被认为是糟糕的编程风格。

如果它是一个局部变量(例如在方法中创建的变量),则必须对其进行初始化。所以我会说,
classx
的默认构造函数初始化
x3
,或者您可以说,默认情况下它将初始化为0

public class Hello {
    private int x;
    private int y = 0;
}
这将生成以下类文件:

public class Hello {

  // Field descriptor #6 I
  private int x;

  // Field descriptor #6 I
  private int y;

  // Method descriptor #9 ()V
  // Stack: 2, Locals: 1
  public Hello();
     0  aload_0 [this]
     1  invokespecial java.lang.Object() [11]
     4  aload_0 [this]
     5  iconst_0
     6  putfield Hello.y : int [13]
     9  return
}
如果我正确阅读上述内容:

  • y
    在隐式无参数构造函数中初始化
  • x
    在任何构造函数中都没有初始化
    • Java确保编译器将为其分配一个默认值
      0
      ,但在字节码中看不到这种初始化,因此可能由编译器决定何时初始化它(即,您应该依赖于在任何特定时刻初始化的变量-即使您通过观察确定何时发生这种情况,也不能保证它在将来或不同JVM之间不会改变)

在进入构造函数之前,它们被初始化为相关的默认值(零或空)

请参阅此类似问题(链接到JLS):


任何其他内容都可能危及Java环境的封装。如果字段未初始化,则可能会暴露未初始化的数据,恶意程序可能会利用这些数据进行攻击。

由于它是类的成员变量,因此默认情况下会将其初始化为其类型的默认值,即0.by类X的默认构造函数?或对象类的默认构造函数?因此,如果X根本没有初始化,那么类X的默认构造函数不是初始化它吗?参见上面的打印输出-字节码在默认构造函数中不包含
X
的初始化,只有
y
在其中初始化。因此,默认值不是使用字节码分配的e指令。当然,它在对象构造中的某个地方设置为
0
,但不在构造函数的字节码中。我猜是在为对象分配内存时,还是在为声明给定实例变量的类运行构造函数之前。Dan,你是说它将由默认的con初始化object类的structor?@Geeg从技术上讲,它是在进入任何构造函数之前初始化的。甚至是超级类的默认构造函数。基本上,在你动手之前!