Java 不初始化局部变量和将属性(整数)初始化为0的逻辑是什么?

Java 不初始化局部变量和将属性(整数)初始化为0的逻辑是什么?,java,class,properties,initialization,local-variables,Java,Class,Properties,Initialization,Local Variables,也许这是个愚蠢的问题?对不起,听起来是这样。我有以下代码 条件1 条件2 我非常清楚第二个条件。a未初始化。因此,这将产生一个错误。但在第一种情况下,我没有初始化属性a。运行以下代码时,不会产生错误。相反,它将显示0。这可能是由于整数被初始化为0 Test t; t = new Test(); t.display(); 不初始化局部变量和将属性(整数)初始化为0的逻辑是什么?参见Java语言规范第4.12.5节: 每个类变量、实例变量或数组组件在创建时都使用默认值初始化 “在使用局部变量之前,

也许这是个愚蠢的问题?对不起,听起来是这样。我有以下代码

条件1 条件2 我非常清楚第二个条件。
a
未初始化。因此,这将产生一个错误。但在第一种情况下,我没有初始化属性
a
。运行以下代码时,不会产生错误。相反,它将显示0。这可能是由于
整数
被初始化为0

Test t;
t = new Test();
t.display();

不初始化局部变量和将属性(整数)初始化为0的逻辑是什么?

参见Java语言规范第4.12.5节:

每个类变量、实例变量或数组组件在创建时都使用默认值初始化


“在使用局部变量之前,无论是通过初始化还是赋值,都必须显式地给它一个值,并且可以使用确定赋值的规则进行验证。”

int是一种基本类型,必须进行初始化,因此java为您做了这件事

将int更改为Integer,您将得到一个空指针异常

如果您以相同的方式创建对象,即不进行初始化,那么您只是在堆栈上创建了一个引用=到null。在您使用构造函数初始化对象之前,堆上实际上没有对象。初始化对象时,其类值也会初始化。这样,对象的任何用户都可以访问或修改吃这些值

有一个大的例外,局部变量。由于局部变量通常用于即时计算,java不会初始化它们。如果您忘记初始化,java将抛出编译器错误,以阻止您使用默认值进行计算

public class Test {

    void display() {
        int a;
        System.out.println(a);
    }
}
Test t;
t = new Test();
t.display();