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

时间:2015-04-10 16:39:48

标签: java constructor

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

我目前所知道的事情:

构造函数用于初始化实例变量,如果我们没有显式地对构造函数进行编码,则会提供默认构造函数,它自动为实例变量提供默认值,如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,但是怎么样?我没有在构造函数中做任何事情,因为我明确地编码了构造函数,不应该调用默认构造函数(我知道我的脑子里有一个错误的概念,所以请纠正我)。

上述代码是如何工作的,请清除我的怀疑。 谢谢!

3 个答案:

答案 0 :(得分:8)

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

其他默认值为

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

答案 1 :(得分:5)

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

答案 2 :(得分:2)

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

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

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返回其对象引用时,该变量将保留其默认初始值。在那个时间点,您的实例变量被设置为其默认值JVM。

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

谢谢