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