java exit(0) final_final修饰传入参数的影响--Java篇

本文探讨了在编程中同事过度使用final修饰局部方法参数的现象,作者澄清了final对基本类型和引用类型的不同影响,并揭示了其实际作用并非阻止方法内修改,而是保证参数值的不可变性。讨论了引用类型中属性可变的情况,并通过实例解析。

写代码的时候,发现有个同事总喜欢将局部方法的参数全部定义为final的,如:

public Map  getEparchyAndCity(final Long acctId){

Map rs = new HashMap();

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来修饰都是一样的效果,如下面的代码:

4423cb83be62214fc257e773fa3da1d1.png

得到结果如下:

"C:\Program Files\Java\jdk1.8.0_144\bin\java" ...

1

1

Process finished with exit code 0

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

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

df801aeebf8cf1d844b56d7babf74877.png

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

dbad33841e77f31def53262531c0cf86.png

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

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

202e1f982a61c35e57d388a8ae36d16f.png

修改后:

4c263bff1b625992f23fc8d542012190.png

得到结果如下:

"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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值