代码之家  ›  专栏  ›  技术社区  ›  Richard H

非初始化和初始化为空有什么区别?

  •  19
  • Richard H  · 技术社区  · 14 年前

    我有这个代码:

    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) {
         ....
    }
    

    我得到同样的编译错误!我必须初始化 对象 为空:

    MyClass object = null;
    

    那么不初始化一个对象和初始化为空有什么区别呢?如果我声明一个没有初始化的对象,它是否仍然是空的?

    谢谢

    3 回复  |  直到 11 年前
        1
  •  27
  •   Bozho    14 年前
    • 字段(成员变量)初始化为 null (或默认基元值,如果它们是基元)
    • 局部变量未初始化,您负责设置初始值。
        2
  •  3
  •   Bane    11 年前

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

    语言说明方法范围的变量 必须 被手动初始化——如果你想让它们以空开始,你必须明确地这样说——如果你不这样做,它们基本上处于未定义的状态。

    相反,语言声明类作用域的变量不需要手动初始化——初始化失败会导致变量自动初始化为空——所以您不必担心。

    至于这两种状态(空与未定义)之间的区别,是的,它们基本上是相同的——但是语言规定您需要初始化一个变量(无论是否自动为您完成,这取决于变量的作用域)。

        3
  •  0
  •   brain    14 年前

    你的声明 对象 实际上是指向堆上MyClass实例的指针或引用的声明。如果你不初始化指针,你基本上会得到一个指向随机位置的指针。通过显式初始化指向空的指针,您将其设置为指向编译器知道无效的空地址。

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

    如果使用C++之类的低级语言,它就更有意义了。