打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
JAVA方法中的参数用final来修饰的原因
很多人都说在JAVA中用final来修饰方法参数的原因是防止方法参数在调用时被篡改,其实也就是这个原因,但理解起来可能会有歧义,有的人认为是调用语句的地方的变量的实际值不会被修改,另一种理解就是仅在调用方法内部不能被修改。
实际上第一种理解是有错误的,对于基本类型来说在调用的地方,用不用final来修饰都是一样的效果,如下面的代码:
publi cstaticvoid main(String hh[])
{
int i = 1;
System.out.println(i);
checkInt(i);
System.out.println(i);
}
public staticvoid checkInt(finalint i)
{
//do something
}
你把checkInt()方法中的参数设成final和非final的效果对调用的地方来说是一样子的。
但是,对于引用类型来说也是一样子的,用不用修饰都不会改变引用地址,而都可以改变引用变量的属性值。如下:
publicstaticvoid main(String hh[])
{
LoginInfo login = newLoginInfo();
login.setPassword("1235");
login.setUserName("mygod");
System.out.println("username:"+login.getUserName()+",password:"+login.getPassword());
checkLoginInfo(login);
System.out.println("username:"+login.getUserName()+",password:"+login.getPassword());
}
publicstaticvoid checkLoginInfo(finalLoginInfo login)
{
login.setUserName("yun");
}
对于第二种说法,是这个样子的,我给了这个参数,你只能用这个参数的值,你不能修改它,对于基本类型和引用类型是一样的,如下:
//如果不是final的话,我可以在checkInt方法内部把i的值改变(有意或无意的,
//虽然不会改变实际调用处的值),特别是无意的,可能会引用一些难以发现的BUG
publicstaticvoid checkInt(int i)
{
i = 200;//这样是可以的,不会编译出错的
//do something
}
//如果是final的话,我可以在checkInt方法内部就没办法把i的值改变
//可以完全避免上面的问题
publicstaticvoid checkInt(finalint i)
{
i = 200;//这样是不可以的,会编译出错的
//do something
}
//final 的引用类型方法参数
publicstaticvoid checkLoginInfo(finalLoginInfo login)
{
login = new LoginInfo();//error,编译不过去
//do something
}
//非final的引用类型方法参数
publicstaticvoid checkLoginInfo(LoginInfo login)
{
//没有任何问题,但是肯定不符合此参数存在的初衷
login = new LoginInfo();
//do something
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
java单点登录的实现
J2SE5.0专题之语言特性
Java中的实参与形参
Java是传值还是传引用
c#关键字
面向对象的编程基础
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服