局部变量初始化null和不初始化之间的区别?

在Java中,有什么区别和最佳方法?

Integer x = null; // x later assign some value. Integer y; // y later initialize and use it. 

答案取决于您所指的变量类型。

对于类变量 ,没有区别,请参阅JLS – 4.12.5。 变量的初始值

…程序中的每个变量在使用其值之前必须具有值:

对于所有引用类型(第4.3节 ),默认值为null

意思是没有区别,后者隐式设置为null

如果变量是本地变量,则必须先将它们分配,然后再将它们传递给方法:

 myMethod(x); //will compile :) myMethod(y) //won't compile :( 

最好不要将它设置为null,否则你可以偶然使用它并导致NPE。 编译器不会帮助您编译错误。 如果你想要像if(x!= null){/ use it /}这样的逻辑,只设置为null

必须在使用之前将局部变量分配给某些东西。

 Integer x = null; myFunction(x); // myFunction is called with the argument null Integer y; myFunction(y); // This will not compile because the variable has not been initialised 

如果没有显式初始化类变量,则总是将类变量初始化为默认值(对象类型为null ,对于基元类似于零)。 局部变量不会被隐式初始化。

没有任何区别。 无论何时你想要使用它,局部变量必须是初始化forms(必须有一个值)。

来自Java doc

与对象如何在字段中存储其状态类似,方法通常将其临时状态存储在局部变量中。 声明局部变量的语法类似于声明字段(例如,int count = 0;)。 没有特殊的关键字将变量指定为本地; 该决定完全来自声明变量的位置 – 它位于方法的开括号和右括号之间。 因此,局部变量只对声明它们的方法可见; 他们无法从class上其他人那里获得。

没有任何差异可以预期一件事,如果你没有初始化它,稍后你尝试使用这个变量(不改变引用)意味着在编译时出错,但如果你初始化它并稍后使用它(不更改引用)表示NullPointerException。

我给你看一个例子。

没有初始化

 Integer y; y.intValue(); // Compilation error 

初始化

 Integer x = null; x.intValue(); // You are able to compile it but NullPointerException 

在内部没有区别。 这也是一个值得商榷的话题。

仅在确实需要时才使用局部变量。 局部变量主要在以下场景中(我可能会缺少其他几个)。

作为速记或可读性

 Integer myObject = someObject.someFunction().someOtherFunction(); 

如果我们在许多地方使用这样的语法,代码将变得笨拙。

为了方便

 Object returnObject = null; if(mycondition) { returnObject = value1; } else if(secondCondition) { returnObject = value2; } return returnObject; 

上述代码段的调用者将根据返回值做出决定。 老实说,我没有看到其他有效的用例来声明没有初始值的变量。

结论(最佳实践):

  • 仅在需要时声明局部变量
  • 始终使用默认值创建局部变量。