1

我对在我看来不一致的原因感到有些困惑。

例如

public class Test
{
    static int a;
    public static void main(String[] args)
    {
        System.out.println(a);
    }
}

所以这将打印出 0,正如预期的那样。但是说我们有这个,

public class Test
{

    public static void main(String[] args)
    {
        int a;
        System.out.println(a);
    }
}

这不会为我编译,抱怨 a 尚未初始化。我期待它打印出0 ...

这让我想到了一些问题:

1) 为什么函数作用域变量没有默认值?

2)静态关键字可能是原因吗?为什么?

4

3 回答 3

4

Java 语言规范解释了变量的默认初始值

每个类变量、实例变量或数组组件在创建时都使用默认值进行初始化(第 15.9 节、第 15.10 节):

对于 byte 类型,默认值为 0,即 (byte)0 的值。

对于short类型,默认值为0,即(short)0的值。

对于 int 类型,默认值为 0,即 0。

对于 long 类型,默认值为 0,即 0L。

对于 float 类型,默认值为正零,即 0.0f。

对于 double 类型,默认值为正零,即 0.0d。

对于 char 类型,默认值为空字符,即 '\u0000'。

对于 boolean 类型,默认值为 false。

对于所有引用类型(第 4.3 节),默认值为 null。

并且还指出

局部变量(第 14.4 节、第 14.14 节)必须在使用之前通过初始化(第 14.4 节)或赋值(第 15.26 节)显式赋予一个值,其方式可以使用明确赋值规则(第16)。

您的两个问题都可以通过“因为 JLS 这么说”来回答。

更完整的答案如下:

类是对状态和行为的描述。对象是实际数据。如果创建一个对象,它必须具有确定状态,不能处于未初始化状态。

于 2013-09-27T01:09:07.890 回答
0

1) 为什么函数作用域变量没有默认值?

JLS定义的规则是方法变量不会被初始化为其默认值。您需要在使用前初始化它们

2)静态关键字可能是原因吗?为什么?

再次形成JLS规则,编译器将类实例变量初始化为默认值。您可能会也可能不会初始化它们。

于 2013-09-27T01:09:23.757 回答
0

Java 编译器从不为链接http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html中提到的局部变量分配默认值

您必须显式初始化它们。

于 2013-09-27T01:11:02.300 回答