返回

为什么局部变量需要显式设置初始化值

发布时间:2022-11-14 19:34:40 337
# java# java

我们在编程中,无时无刻地都在于方法打交道,而在方法中,我们很难不使用局部变量,比如我们有下面的这样一段很简单的代码

 

public void dump() {
String localName;
System.out.println("dump localName=" + localName);
}

随着我们敲打出上面的代码,IDE也会同时抛给我们一个错误,就是 ​​Variable 'localName' might not have been initialized​

这是什么错误,localName没有初始化?为什么成员变量是可以的的,不信你看

 

public class Test {
public String name;

public void dumpField() {
System.out.println("dumpField name=" + name);
}
}

是的,上面的成员变量是没有问题,也没有警告的。

这就奇怪了,这是为什么呢,javac怎么这么蠢呢?

答案是否定的。javac足够有能力推断出局部变量并初始化默认值。然而它并没有这样做。

想要弄清楚为什么这样做就,就需要搞清楚局部变量和成员变量的关于赋值和取值的顺序的差异。

对于成员变量而言,其赋值和取值访问的先后顺序具有不确定性。还是以这段代码为例。

 

public class Test {
public String name;

public void dumpField() {
System.out.println("dumpField name=" + name);
}
}

name的赋值可以发生在dumpField之前,也可以发生在dumpField之后。这是在运行时发生的,在编译器来看确定不了的。对于没把握的事情,javac是不会去做的,这种事情交给运行时的JVM就可以了。

而对于成员变量而言,其赋值和取值访问顺序是确定的。比如这段代码

 

public void dump() {
String localName;
System.out.println("dump localName=" + localName);
}

因为localName的作用范围只限定于dump方法中,必然的顺序就是先赋值(声明),再进行访问。

说了半天还没有说局部变量为什么显式设置初始值呢?

其实之所以这样做就是一种对程序员的约束限制。因为程序员(人)是(有些情况下)是靠不住的,假使局部变量可以使用默认值,我们总会无意间忘记赋值,进而导致不可预期的情况出现。这

“之所以设计成这样完全是一种策略决定,并非是我力不能及,年轻人,我只能帮你到这里了。”,Javac如是说。

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线