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

时间:2014-05-02 08:27:27

标签: java class properties initialization local-variables

可能这是一个愚蠢的问题?对不起听起来如此。我有以下代码。

条件1

public class Test {

    int a;

    void display() {
        System.out.println(a);
    }
}

条件2

public class Test {

    void display() {
        int a;
        System.out.println(a);
    }
}

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

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

不初始化局部变量并将属性(整数)初始化为0的原因是什么?

2 个答案:

答案 0 :(得分:2)

请参阅Java语言规范部分4.12.5:http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5

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

"在使用初始化或赋值之前,必须通过初始化或赋值方式为局部变量显式赋值,并且可以使用明确赋值的规则进行验证。"

答案 1 :(得分:0)

int是一个基本类型,必须初始化,所以java会为你做。

将int更改为Integer,您将获得空指针异常。

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

有一个BIG例外,局部变量。因为局部变量通常用于立即计算,所以java不会初始化它们。如果您忘记这样做,java将抛出编译器错误,以防止您使用默认值进行计算。