非初始化和初始化为null之间有什么区别?
我有这个代码:
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吗?
谢谢
- fields(成员变量)被初始化为
null
(或者是默认的原始值,如果它们是基元) - 局部变量未初始化,您负责设置初始值。
这是一个语言定义的东西。
该语言指出METHOD-scope的变量必须手动初始化 – 如果你希望它们从NULL开始,你必须明确地这样说 – 如果你不这样做,它们基本上处于未定义状态。
相反,该语言声明CLASS-scope的变量不需要手动初始化 – 初始化它们失败导致它们自动初始化为NULL – 因此您不必担心它。
至于两种状态之间的差异(null与undefined),是的它们基本相同 – 但语言要求你需要初始化一个变量(无论是否为你自动完成,取决于变量的范围) )。
您的对象声明实际上是指向堆上MyClass实例的指针或引用的声明。 如果你没有初始化指针,你基本上会得到一个指向随机某处的指针。 通过明确地将指针初始化为NULL,您将其设置为指向编译器知道无效的NULL地址。
Java中引入了额外的混淆,因为它隐式地将成员变量初始化为NULL。
如果你使用像C ++这样的低级语言,那就更有意义了。