有一次可以为数据成员而不是局部变量分配默认值的原因是什么?有具体原因吗?
示例:
Class A {
B b;
public void f(){
int a;
}
在上面的类中,b用null初始化,但编译器会抛出错误,说f()内部的变量未初始化。
答案 0 :(得分:2)
我会说(一如既往)实际原因。您可以在一个点初始化对象并在以后使用它 - 然后您必须有一些机制来确保所有内容都初始化为某个默认值,以防我们无法立即设置它们。
另一方面,本地对象在声明之后立即使用 - 因此我们可以安全地假设程序员能够使用其目标值启动它们,并且应该鼓励它。
底线 - 只是实际原因,鼓励可以防止一些错误的良好做法,而不是技术限制。
答案 1 :(得分:-2)
为什么使用默认值
初始化数据成员
编译类时,Java编译器会为您在类的源代码中声明的每个构造函数创建一个实例初始化方法。虽然构造函数不是方法,但实例初始化方法是。它有一个名称,一个返回类型,void和一组参数,这些参数与生成它的构造函数的参数相匹配。
如果您没有在类中显式声明构造函数,Java编译器将动态创建默认构造函数,然后将该默认构造函数转换为相应的实例初始化方法。因此,每个类至少有一个实例初始化方法。
而局部变量不是
为局部变量分配资源时,Java不会将值写入内存。出现错误的原因是因为Java确保在使用它之前给它一个值。 堆栈包含局部变量,因此它们可能会获取堆栈前面的任何值。为了防范这种情况,编译器可以检查它们是否已经初始化。