为什么必须在Java中初始化局部变量(包括基元)?为什么必须在Java中初始化局部变量(包括基元)?为什么在实例变量的情况下不相同?
3 回答

守候你守候我
TA贡献1802条经验 获得超10个赞
好吧,在局部变量的情况下,很清楚“之前”是什么意思,因为声明(在方法中)和引用之间的程序流是顺序的。如果在方法之外声明的字段,编译器永远不知道将要使用哪个代码,因此它不能生成错误,因为可能某些其他方法在使用之前初始化该字段。

HUH函数
TA贡献1836条经验 获得超4个赞
在Java中,如果未手动初始化类和实例变量,则它们将采用默认值(null,0,false)。但是,局部变量没有默认值。除非为局部变量赋值,否则编译器将拒绝编译读取它的代码。恕我直言,这导致了这样的结论:在声明它时,初始化一个带有一些默认值的局部变量(如null,后面可能会导致NullPointerException)实际上是一件坏事。请考虑以下示例:
Object o;if (<some boolean condition>) o = <some value>;else o = <some other value>;System.out.println(o);
o
使用null 的初始化是完全没有必要的,因为Java编译器在编译时检查任何代码路径o
在读取变量之前初始化(使用null或某些非null值)。这意味着,System.out.println(o);
如果您要o
在上面的代码片段中注释掉变量的两个初始化中的任何一个,编译器将拒绝编译该行。
这适用于Java,也许仅适用于Java。我不知道像C#这样的语言。但是,在旧的C(也许是C ++)中,仍然建议在声明变量AFAIK时始终初始化变量。这种“老派”编程语言可能是这样的原因,即始终初始化变量的建议出现在书籍和关于Java等现代语言的讨论中,其中编译器会跟踪变量是否已初始化。
添加回答
举报
0/150
提交
取消