我们知道......
实例变量在默认构造函数中初始化。例如。
public class H{
int x;
public static void main(String... args){
System.out.print(new H().x);
}
}
上面代码的O / P是 0 ,因为有一个默认的构造函数被调用,并且该构造函数将x初始化为0。
现在,我的问题是,如果我们运行以下代码,即
public class H{
int x;
public H(){}
public static void main(String... args){
System.out.print(new H().x);
}
}
在这种情况下,实际的O / P也是 0 ,但我认为应该有编译器错误,x未初始化,因为我们已经覆盖默认构造函数而没有初始化xI think我的问题很清楚......
答案 0 :(得分:8)
默认情况下,在java中初始化非final字段。默认情况下,仅初始化方法和最终字段中的变量。
如果你声明x是最终的,那么你就是对的。您将在代码中遇到编译错误。
答案 1 :(得分:7)
在Java中,实例成员默认默认为其值的所有位数版本(int
为0
,对象引用为null
,floats
是0.0
,布尔是false
,依此类推)。它不是默认构造函数所做的,它是在构造函数运行之前完成的。
订单是:
将实例成员默认为其all-bits-off值。 (优化器可以跳过这个,如果它看到#2或可能,如果它可以向自己证明在每个#3初始化之前没有使用该成员。) < / p>
应用它们的任何内联初始化。例如:
int a = 42;
以源代码顺序应用实例初始化块。
调用相应的构造函数。
例如:
class Example {
int a = 42;
// Instance initializer block:
{
this.a = 67;
}
Example() {
System.out.println(this.a);
}
}
new Example()
输出67
。
显然,在这两个地方进行初始化都是不好的做法,这仅仅是为了说明。
答案 2 :(得分:3)
所有实例级变量都初始化为其默认值,而不管构造函数是否已经过载(或者添加了显式的无参数构造函数)。构造函数只是更改默认值。
答案 3 :(得分:2)
实例变量具有与之关联的默认值
默认值
声明字段时并不总是需要指定值。声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值为零或null,具体取决于数据类型。
答案 4 :(得分:1)
Java对于程序员来说非常简洁(不像其他人,例如C),这意味着它会自动初始化字段。一个例外是方法中的最终字段和字段(然后编译器将产生错误)。
希望它有所帮助。