【问题标题】:What happens to a declared, uninitialized variable in Java?Java 中声明的、未初始化的变量会发生什么?
【发布时间】:2016-12-28 20:01:07
【问题描述】:

它有价值吗?

我试图了解 Java 中已声明但未初始化的变量/对象的状态。

我无法实际测试它,因为我不断收到 "Not Initialized" 编译错误,而且我似乎无法抑制它。

例如,我猜如果变量是integer,它可能等于0

但是如果变量是一个字符串,它会等于null 还是isEmpty() 会返回true

所有未初始化变量的值是否相同?还是每个声明(含义、整数、字符串、双精度等)在未显式初始化时都有不同的值?


更新

因此,正如我现在所看到的,如果将变量声明为 locally 或在 Class 中,则会产生很大的不同,尽管我似乎无法理解为什么在类中声明为静态时它没有给出错误,但是在主要声明时,它会产生"Not Initialized" error

【问题讨论】:

  • 取决于,类变量还是局部变量?类变量要么是null,要么是具有代表性的默认值,局部变量不能被统一化。
  • 那么有没有办法不初始化一个局部变量呢?嗯,可以说它是一个类变量,无论如何它都会为空?我会得到整数,但字符串等仍然为空?
  • 如果你声明了一个对象,比如String myString;,但什么也不做,那么在运行时使用myString.isEmpty()会产生一个nullPointerException。基元“一般”默认为“0”、“0.0”等......
  • 对于原始类型,它将是默认值(布尔为 false,数字等为 0),但对于对象,它始终为 null

标签: java initialization


【解决方案1】:

JVM 究竟如何做到这一点完全取决于 JVM,对程序员来说并不重要,因为编译器会确保您不会读取未初始化的 本地 变量。

字段是不同的。在读取它们之前不需要分配它们(除非它们是final),并且尚未分配的字段的值对于引用类型是 null 或适当原始类型的 0 值,如果该字段具有原始类型。

s.isEmpty() 用于尚未分配的字段String s; 会导致NullPointerException


因此,正如我现在所看到的,如果将变量声明为 locally 或在 Class 中,则会产生很大的不同,尽管我似乎无法理解为什么在类中声明时它没有给出错误,但是当主要声明它会产生"Not Initialized" 错误。

一般来说,使用没有值的值是不可取的。出于这个原因,语言设计者有两个选择:

a) 为尚未初始化的变量定义默认值
b) 防止程序员在写入之前访问变量。

b) 对于字段很难实现,因此为字段选择了选项 a)。 (可能有多种读/写方法有效或无效,具体取决于调用顺序,只能在运行时确定)。

对于局部变量,选项 b) 是可行的,因为可以检查方法执行的所有可能路径是否有赋值语句。在为局部变量设计语言时选择了此选项,因为它可以帮助发现许多容易出现的错误。

【讨论】:

  • 我明白了,你能不能也看看更新并告诉我?
  • @hedgehog 相同的答案,在类级别将其声明为静态变量,而不是在静态方法中本地声明它
【解决方案2】:

默认值将基于数据的类型和您使用初始化变量的位置。请参考下面的原始默认值。

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

【讨论】:

    【解决方案3】:

    Fabian 已经给出了非常明确的答案,我只是尝试添加来自official documentation 的规范以供参考。

    类中的字段

    声明字段时并不总是需要赋值。 已声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值将为零或空,具体取决于数据类型。然而,依赖这样的默认值通常被认为是糟糕的编程风格。

    如果没有指定default value,它只会被视为bad样式,而local variables中的情况则不同。

    局部变量

    局部变量略有不同;编译器从不为未初始化的局部变量分配默认值。如果您无法在声明它的地方初始化局部变量,请确保在尝试使用它之前为其分配一个值。访问未初始化的局部变量将导致编译时错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      相关资源
      最近更新 更多