空构造函数但实例变量仍然初始化?

Empty constructor but instance variable still initialized?

我是java的新手,我对对象初始化有疑问。

我目前知道的:

构造函数用于初始化实例变量,如果我们不显式编写构造函数,则提供默认构造函数,自动为实例变量提供默认值,例如 0 表示 int 等。

我的问题: 以下代码是如何工作的(我没有初始化实例变量)?

我尝试了如下基本代码:

public class hello{

int i;   //Instance variable
         public hello()
         {
         //Constructor is empty!!!
        }


public static void main(String args[])
    {

  System.out.println(new hello().i);


}
}

结果是 0,但是怎么办?我没有在构造函数中做任何事情,因为我明确地编写了构造函数,所以不应该调用默认构造函数(我知道我的想法有误,所以请纠正我)。

上面的代码是如何实现的,请解开我的疑惑。 谢谢!

默认构造函数不初始化任何东西。它是空的。无论构造函数如何,字段级变量都会自动初始化为一些默认值(例如 0 用于 int 类型)。

其他默认值为

boolean -> false
double -> 0.0D
[any object reference incl. String] -> null

您可能混淆了实例变量和局部变量。局部变量是在使用前必须初始化的变量,否则会出现编译错误。 int i 在这种情况下是一个实例变量,它可以保持未初始化状态而不会导致编译器报错。 int实例变量默认为0。

如果您没有为实例变量提供显式初始化,它们将被授予可预测的默认初始值,这些初始值仅基于变量的类型。

以下是所有类型的默认值:

Type                          Default Value
boolean                          false
byte                            (byte) 0
short                           (short) 0
int                                 0
long                                0L
char                             \u0000
float                              0.0f
double                             0.0d
object reference                   null

即使您已经显式创建了其中包含空代码的默认构造函数

在您的代码中,以下行将被执行

System.out.println(new hello().i);

如果你没有在你的构造函数中显式地初始化一个实例变量,那么当new returns its object reference.At 那个时候那个变量将保留它的默认初始值,你的实例变量是由 JVM 设置为默认值。

而且每当需要创建对象时,JVM 都会在调用默认构造函数之前调用 Instance Initializer Block[IIB]。

谢谢