Java中未初始化的对象变量和初始化为null的对象变量有什么区别


12

我有以下两个对象变量

Date a;
Date b=null;

绝对“ a”和“ b”都没有引用任何对象。

现在,如果我调用以下语句

System.out.println(a.toString());

会有编译时错误,但是如果我调用以下语句

System.out.println(b.toString());

不会有编译时错误,但会存在运行时错误。这是什么原因,什么值将实际存储在“ b”中以表示空值?


2
在SO上多次问及回答:为什么局部变量未在Java中初始化?Java中的未初始化变量和成员以及与此相关的许多问题
gnat 2014年

@gnat,还有其他问题要解决“未初始化”和“空”之间的区别吗?仅仅因为答案相似,并不意味着这是一个重复的问题。
DougM 2014年

@DougM当然,您读过我提到的第一个问题吗?“是否有任何理由使Java设计人员感到不应为局部变量赋予默认值?认真地说,如果可以为实例变量赋予缺省值,那为什么我们不能对局部变量做同样的事情呢?” (FWIW它不能在技术上是重复的,只是因为这是在另一个站点)
蚊蚋

1
这没有解决“未初始化”和“初始化为null”之间的区别,只是“为什么变量不会自动初始化为null?” 同一主题,问题略有不同。
DougM 2014年

Answers:


3

那是因为局部变量的状态被控制在其范围内

 // method/loop/if/try-catch etc...
 {
   Date d; // if it's not intialised in this scope then its not intialised  anywhere
 }

字段不是这样

class Foo{
 Date d; // it could be intialised anywhere, so its out of control and java will set to null for you
}

现在,为什么可以将变量设置为null并立即使用它呢?也许那是一个历史错误,有时会导致可怕的错误

 {
  Date d = null;
  try{
  }catch{ // hide it here 
  }
  return d;
 } 

现在在语义上有什么区别?

Date d;

只是声明了一个变量,该变量可以包含指向类型的对象的引用Date,但是

Date d= null; 

完全相同,但是这次引用指向null,这与任何引用一样,它占用一个本机指针的空间,即在32位计算机上为4字节,在64位计算机上为8字节


这似乎只是重复一小时前发布的先前回答中提出和解释的观点
2014年

@gnat感谢您的评论,但我认为不是,欢呼
Sleiman Jneidi

您是说null还是存储在内存中某个位置的对象,并且所有分配了null的对象变量都指向该null对象。
Harish_N 2014年

@ Harish.N不,我没有说过,我说的是引用而非对象
Sleiman Jneidi

在示例中,给定d是引用。它引用类型为Date的对象...类似,如果null引用它引用的对象是...。
Harish_N 2014年

19

类字段没有区别。null默认情况下,它们是对象的值,0是数字值和false布尔值。

对于在方法中声明的变量-Java要求将它们初始化。如果不初始化它们,则在访问它们时会导致编译时错误。

什么原因?可以通过任何方法修改类字段。以任何顺序调用该方法。所有非私有字段都可以由其他类和/或扩展该类的类来修改。因此,没有通知未初始化的变量是没有意义的,因为它可以在很多地方分配。

但是,方法内部的变量是局部变量,只能在方法本身内部进行修改。因此指出可能的错误既可能,也很合理。然后编译器尝试执行此操作。如果知道该字段未初始化,则将显示错误,因为这永远不是您想要的。如果不确定-它将发出警告,以便您可以确定。

public static class Test {
    Date a; // ok 
    Date b = null; // ok

    public void test() {
        Date c;
        Date d = null;

        System.out.println(a.toString());
        System.out.println(b.toString());
        System.out.println(c.toString()); // error
        System.out.println(d.toString()); // warning
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.