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

写代码的时候,发现有个同事总喜欢将局部方法的参数全部定义为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

总结:

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

具体可以参考下面一篇:

    https://my.oschina.net/u/3209432/blog/1595316

转载于:https://my.oschina.net/loubobooo/blog/1595219

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值