Java 构造函数初始化变量
关于变量x3,哪个构造函数初始化它?我似乎不明白。它会是类X的无参数构造函数吗?或者可能是对象类的默认构造函数Java 构造函数初始化变量,java,Java,关于变量x3,哪个构造函数初始化它?我似乎不明白。它会是类X的无参数构造函数吗?或者可能是对象类的默认构造函数 class X { int x1, x2, x3; } x3是一个实例变量,它的默认值为0(对于int)。来自Java文档: 声明字段时并不总是需要赋值。声明为但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值将为零或null,具体取决于数据类型 然而,依赖这些默认值通常被认为是糟糕的编程风格。 如果它是一个局部变量(例如在方法中创建的变量),则必须对其进行初始
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确保编译器将为其分配一个默认值
,但在字节码中看不到这种初始化,因此可能由编译器决定何时初始化它(即,您应该不依赖于在任何特定时刻初始化的变量-即使您通过观察确定何时发生这种情况,也不能保证它在将来或不同JVM之间不会改变)0
- Java确保编译器将为其分配一个默认值
任何其他内容都可能危及Java环境的封装。如果字段未初始化,则可能会暴露未初始化的数据,恶意程序可能会利用这些数据进行攻击。由于它是类的成员变量,因此默认情况下会将其初始化为其类型的默认值,即0.by类X的默认构造函数?或对象类的默认构造函数?因此,如果X根本没有初始化,那么类X的默认构造函数不是初始化它吗?参见上面的打印输出-字节码在默认构造函数中不包含
X
的初始化,只有y
在其中初始化。因此,默认值不是使用字节码分配的e指令。当然,它在对象构造中的某个地方设置为0
,但不在构造函数的字节码中。我猜是在为对象分配内存时,还是在为声明给定实例变量的类运行构造函数之前。Dan,你是说它将由默认的con初始化object类的structor?@Geeg从技术上讲,它是在进入任何构造函数之前初始化的。甚至是超级类的默认构造函数。基本上,在你动手之前!