Java 为什么数据成员是用默认值初始化的,而局部变量不是?

Java 为什么数据成员是用默认值初始化的,而局部变量不是?,java,class,Java,Class,有人能解释一下为数据成员而不是局部变量指定默认值的原因吗?有没有具体的原因 例如: Class A { B b; public void f(){ int a; } 在上面的类中,b被初始化为null,但是编译器抛出错误并指出f()内的变量a未初始化 我会说这是(一如既往的)实际原因。您可以在某一点初始化对象,稍后再使用它-然后您必须有某种机制,确保所有内容都初始化为某个默认值,以防我们无法立即设置它们 另一方面,本地对象在声明后会立即被使用,所以我们可以安全地假设程序员能够使用它们的目标值

有人能解释一下为数据成员而不是局部变量指定默认值的原因吗?有没有具体的原因

例如:

Class A {
B b;

public void f(){
int a;
}
在上面的类中,b被初始化为null,但是编译器抛出错误并指出f()内的变量a未初始化

我会说这是(一如既往的)实际原因。您可以在某一点初始化对象,稍后再使用它-然后您必须有某种机制,确保所有内容都初始化为某个默认值,以防我们无法立即设置它们

另一方面,本地对象在声明后会立即被使用,所以我们可以安全地假设程序员能够使用它们的目标值来启动它们,这是值得鼓励的

底线——仅仅是实际的原因,鼓励良好的实践来防止一些错误,而不是技术上的限制

为何使用默认值初始化数据成员

编译类时,Java编译器会为在类的源代码中声明的每个构造函数创建一个实例初始化方法。尽管构造函数不是方法,但实例初始化方法是。它有一个名称、返回类型、void和一组参数,这些参数与生成它的构造函数的参数相匹配

如果没有在类中显式声明构造函数,Java编译器将动态创建默认构造函数,然后将该默认构造函数转换为相应的实例初始化方法。因此,每个类将至少有一个实例初始化方法

而局部变量则不是

当您为局部变量分配资源时,Java不会将值写入内存。出现错误的原因是Java确保在使用它之前为它指定一个值。
堆栈包含局部变量,因此它们可能会获取它们之前堆栈上的任何值。为了防止出现这种情况,编译器可以检查它们是否已初始化。

请参见Eric Lippert的回答,最初是在C语言上提出的,但考虑到两种语言之间的相似性,我认为原因是相同的。我不知道JVM在初始化过程中到底发生了什么。但强制编译器对默认值进行隐式初始化并不困难。我看不出有任何技术限制会迫使语言设计者这样做,所以我认为这只是一个实际的原因——它有助于防止错误。调试器不显示垃圾也会有好处,但我不确定JVM的当前设计是否会允许您看到垃圾(除非从某个JNI方法中看到垃圾,但默认值从来都不是这样)