它有价值吗?
我试图理解Java中已声明但未初始化的变量/对象的状态是什么。
我实际上无法测试它,因为我一直得到“未初始化”编译错误,我似乎无法抑制它。
虽然例如,我猜想如果变量是integer
,它可能等于 0 。
但是,如果变量是一个String,那么它将等于null
还是isEmpty()
会返回true
?
所有非初始化变量的值是否相同?或者每个声明(意思,整数,字符串,双精度等)在未明确初始化时具有不同的值?
正如我现在看到的,如果变量被声明为locally
或者Class
,它会产生很大的不同,尽管我似乎无法理解为什么在类中声明为静态时它没有错误,但在主要声明时它产生"Not Initialized" error
。
答案 0 :(得分:5)
JVM究竟如何完全取决于JVM,对于程序员来说并不重要,因为编译器可以确保您不会读取未初始化的本地变量。
字段然而不同。在读取它们之前不需要分配它们(除非它们是final
)并且未分配的字段值对于引用类型是null
或者是适当原语的0
值如果字段具有基本类型,则输入类型。
将s.isEmpty()
用于尚未分配的字段String s;
会产生NullPointerException
。
正如我现在看到的,如果变量被声明为
locally
或Class
,它会产生很大的不同,尽管我似乎无法理解为什么在类中声明时它不给出错误,但在主要声明时会产生"Not Initialized"
错误。
通常,处理没有值的值是不可取的。出于这个原因,语言设计师有两个选择:
a)为尚未初始化的变量定义一个默认值 b)在写入变量之前阻止程序员访问变量。
b)很难为字段实现,因此选择a)字段。 (可能有多种方法读/写可能有效或无效,具体取决于调用的顺序,这只能在运行时确定。)
对于局部变量,选项b)是可行的,因为可以检查方法执行的所有可能路径的赋值语句。在本地变量的语言设计过程中选择了此选项,因为它可以帮助找到许多容易出错的错误。
答案 1 :(得分:1)
默认值将基于数据类型和使用初始化变量的位置。请参阅下面的原始默认值。
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
答案 2 :(得分:1)
Fabian已经提供了一个非常明确的答案,我只是尝试从official documentation添加规范以供参考。
声明字段时,不一定总是需要分配值。编译器将声明但未初始化的字段设置为合理的默认值。通常,此默认值将为零或null,具体取决于数据类型。但是,通常认为依赖这种默认值是坏编程风格。
如果未指定default value
,则仅将其视为坏样式,而在local variables
中则不一样。
局部变量略有不同;编译器从不将默认值分配给未初始化的局部变量。如果您无法在声明它的地方初始化本地变量,请确保在尝试使用它之前为其分配一个值。访问未初始化的局部变量将导致编译时错误。