【问题标题】:Java default values confusion, why none for function scoped variables? [duplicate]Java默认值混淆,为什么没有函数范围变量? [复制]
【发布时间】:2013-09-27 01:06:46
【问题描述】:

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

例如

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)静态关键字可能是原因吗?为什么?

【问题讨论】:

  • 在 Java 中只有类变量有默认值。 Static 与此无关。

标签: java


【解决方案1】:

Java 语言规范解释了默认的Initial values of Variables

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

对于字节类型,默认值为零,即 (字节)0.

对于short类型,默认值为0,即的值 (短)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 这么说”来回答。

更完整的答案如下:

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

【讨论】:

  • 啊!我已经阅读了第一部分,但我没有阅读 14.4 和相关文档。 /尴尬的。谢谢!!编辑:是的,我希望除了“它这么说响应”之外还有一个更有意义的答案,但我听说这在 Java 中更是如此,(这里是 Python 程序员)。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    你必须明确地初始化它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 2013-08-16
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      相关资源
      最近更新 更多