前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么局部变量需要显式设置初始化值

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

作者头像
技术小黑屋
发布2018-09-05 09:58:36
7240
发布2018-09-05 09:58:36
举报
文章被收录于专栏:技术小黑屋

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

1 2 3 4

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

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

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

1 2 3 4 5 6 7

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

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

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

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

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

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

1 2 3 4 5 6 7

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

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

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

1 2 3 4

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

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档