首页 > 其他分享 >为什么局部变量需要显式设置初始化值

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

时间:2022-11-10 20:34:59浏览次数:43  
标签:初始化 name dump 局部变量 dumpField 显式 localName public


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



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如是说。

标签:初始化,name,dump,局部变量,dumpField,显式,localName,public
From: https://blog.51cto.com/u_3987305/5842012

相关文章

  • 新唐arm系统初始化
    初始化分为系统初始化和ip初始化本文主要讲系统初始化,主要是时钟相关的设置。先看手册中时钟的框图涉及到系统初始化的引脚,通过原理图上可知HXT使用pf2pf3.uart0使用pb12......
  • Java中的对象使用、局部变量与成员变量的区别
    对象的使用对象的使用格式创建对象:类名对象名=new类名();使用对象访问类中的成员:对象名.成员变量;对象名.成员方法();对象的使用格式举例:publicstatic......
  • react初始化代码下载太慢的解决方案
    react官方提供的初始方式:npxcreate-react-appmy-appcdmy-appnpmstart 这个方式的第一句npxcreate-react-appmy-app是从官网  https://registry.npmjs.......
  • [MindSpore快速入门]Tensor张量:初始化,属性,索引,转换。01
    ​​MindSpore​​​​03张量_哔哩哔哩_bilibili​​注意本文多次引用官网的教程,以及其在b站上发的视频。这并不是我的文章,只能说我把细节打印整理下来,故我会将其标注为转......
  • git 本地初始化项目后 推送到现有分支
    1、添加用户名与邮箱地址gitconfig--globaluser.name"name"gitconfig--globaluser.email"email"2、重置密码gitconfig–system–unsetcredential.hel......
  • 类和对象-对象的初始化和清理
    4.2对象的初始化和清理生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全C++中的面向对象来源于生活,每个对象也都会有......
  • visual c++6.0对浮点数处理器的初始化
       <C++反汇编与逆向分析>的作者在书中P21页列写了一段代码:intmain(){intnInt0;scanf("%f",&nInt);}并简短的提到,运行上面这段程序并输入小数,将会导致程序崩......
  • 局部变量和全局变量
    局部变量就是局部范围内有效的变量局部变量的定义位置:函数开头中间,以及形式参数。优点:再执行结束后会释放内存;全局变量就是在定义以下都有效的变量全局变量......
  • Java学习笔记day5--成员变量和局部变量的比较
    packageday5_oop1;/*类中属性的使用属性(成员变量)vs局部变量1.相同点1.1定义变量的格式一样数据类型变量名=变量值1.2先声......
  • 001.项目初始化,生成逆向文件
    1.整合Mybatis1.1在pom.xml中添加文件<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-......