您的位置:首页 > 编程语言 > Java开发

final修饰传入参数的影响--Java篇

2017-12-26 00:00 211 查看
写代码的时候,发现有个同事总喜欢将局部方法的参数全部定义为final的,如:

public Map<String, String> getEparchyAndCity(final Long acctId){

Map<String,String> rs = new HashMap<String,String>();

TfFAccountPo account = tfFAccountPoExtMapper.selectByAcctId(acctId);

rs.put("cityCode", account.getCityCode());
rs.put("eparchyCode", account.getEparchyCode());

return rs;
}

final类型修饰的参数分为两种类型 基本类型 与引用类型 。

Java基本类型一共8种,int long boolean double short float char byte

引用类型大致是3种,类class 接口interface 数组array

重点说一下类,Object String Date void ......以及基本类型的包装类 Integer Long Boolean Double Short Float Char Byte

===============================================================

刚开始,我理解的Java中用final来修饰方法内的传参的原因,是防止方法参数在调用时被篡改,其实这对调用的时候没有影响,也没有区别。因为我认为调用语句的变量的实际值不会被修改,其实更准确的是在调用方法内部不能被修改。

1. 认为调用语句的变量的实际值不会被修改。对于基本类型来说,在调用的地方,用或不用final来修饰都是一样的效果,如下面的代码:



得到结果如下:
"C:\Program Files\Java\jdk1.8.0_144\bin\java" ...
1
1

Process finished with exit code 0

把checkModify()方法中的参数设成final和非final的效果对调用的地方来说是一样的。

2. 如果在方法中修改上述方法的参数,则会报错如下图:



3. 但是,对于引用类型来说也是一样子的,用不用修饰都不会改变引用地址,而都可以改变引用变量的属性值。如下:



注:这里使用lombok自动生成get和set方法以及toString方法(需要lombok.jar)

debug查看引用地址,发现引用地址并没有发生变化,修改前:



修改后:



得到结果如下:
"C:\Program Files\Java\jdk1.8.0_144\bin\java" ...
修改前===============================
username: zhangsan,age:1
修改后===============================
username: lisi,age:1

Process finished with exit code 0

总结:

在调用的参数内部 无论是基本类型还是引用类型,其值不可改变(引用类型指的引用对象不变)

引用类型中属性可变

具体可以参考下面一篇:
https://my.oschina.net/u/3209432/blog/1595316
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java