在网上搜的结果都是相同的一句话,配一段毫无关系的代码,说明不了问题。
这里先给出原因:成员变量其赋值和取值的顺序具有不确定性,可以在方法调用(取值)前赋值,也可以在方法调用(取值)后赋值,其具体顺序是在运行时发生的,编译器确定不了。而局部变量,赋值、取值顺序确定。所以局部变量赋值使用,是一种设计约束,可以减少犯错的可能性。
一个可以准确说明问题的例子:
public class InstanceInitializer {
private int j = getI();
private int i = 1;
public InstanceInitializer() {
i = 2;
}
private int getI() {
return i;
}
public static void main(String[] args) {
InstanceInitializer ii = new InstanceInitializer();
System.out.println(ii.j);
System.out.println(ii.getI());
}
}
说明:这个例子引自其他文章,我在此之上稍作改动使得其更能说明问题。
输出的结果是:
0
2
从第一行输出结果可以看出实例化时先执行了getI()
函数,此时i
还没有对i进行初始化赋值。所以得到默认值0(实例化对象分配内存时赋的默认值。显式赋值privatr int i = 1;
此时没有执行)。这里充分体现了上面原因中所说的"成员变量可以在方法调用后赋值
",如果没有默认赋值,则此时函数返回值无法确定。所以强制要求成员变量赋初值没有什么太大意义。