我是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,但是怎么样?我没有在构造函数中做任何事情,因为我明确地编码了构造函数,不应该调用默认构造函数(我知道我的脑子里有一个错误的概念,所以请纠正我)。
上述代码是如何工作的,请清除我的怀疑。 谢谢!
答案 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]。
谢谢