非初始化和初始化为null之间有什么区别?

时间:2010-11-10 14:54:17

标签: java initialization

我有这段代码:

MyClass object;

.... some code here where object may or may not be initialised...

if (object.getId > 0) {
    ....
}

导致编译错误:object可能尚未初始化,这是公平的。

现在我将代码更改为:

MyClass object;

.... some conditional code here where object may or may not be initialised...

if (object != null && object.getId > 0) {
     ....
}

我得到相同的编译错误!我必须将object初始化为null:

MyClass object = null;

那么,不初始化对象和初始化为null之间的区别是什么?如果我声明一个没有初始化的对象,那么它还不是null吗?

由于

3 个答案:

答案 0 :(得分:27)

  • fields(成员变量)初始化为null(或默认原始值,如果它们是基元)
  • 本地变量未初始化,您负责设置初始值。

答案 1 :(得分:3)

这是一种语言定义的东西。

该语言指出METHOD-scope MUST 的变量必须手动初始化 - 如果你想让它们从NULL开始,你必须明确地这样说 - 如果你没有这样做,他们会基本上处于未定义状态。

相反,该语言声明CLASS-scope的变量不需要手动初始化 - 初始化它们失败会导致它们自动初始化为NULL - 因此您不必担心它。

就两种状态(null与undefined)之间的差异而言,是的,它们基本相同 - 但语言要求你需要初始化一个变量(无论是否为你自动完成,取决于变量的范围)。

答案 2 :(得分:0)

object 的声明实际上是对堆上MyClass实例的指针或引用的声明。如果你没有初始化指针,你基本上会得到一个指向随机某处的指针。通过明确地将指针初始化为NULL,您将其设置为指向编译器知道无效的NULL地址。

在Java中引入了额外的混淆,因为它隐式地将成员变量初始化为NULL。

如果你使用像C ++这样的低级语言,那就更有意义了。