JAVA
方法中的参数用
final
来修饰的原因
很多人都说在
JAVA
中用
final
来修饰方法参数的原因是防止方法参数在调用时被篡改,其实也就是这个原因,但理解起来可能会有歧义,有的人认为是调用语句的地方的变量的实际值不会被修改,另一种理解就是仅在调用方法内部不能被修改。
实际上第一种理解是有错误的,对于基本类型来说在调用的地方,用不用
final
来修饰都是一样的效果,如下面的代码:
publi cstatic void
main(String hh[])
{
int
i = 1;
System.
out
.println(i);
checkInt(i);
System.
out
.println(i);
}
public static void
checkInt(
final int
i)
{
//do something
}
|
你把checkInt()方法中的参数设成final和非final的效果对调用的地方来说是一样子的。
但是,对于引用类型来说也是一样子的,用不用修饰都不会改变引用地址,而都可以改变引用变量的属性值。如下:
publicstaticvoid
main(String hh[])
{
LoginInfo login =
new
LoginInfo();
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(
final
LoginInfo 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(
final
LoginInfo login)
{
login =
new
LoginInfo();//error,
编译不过去
//do something
}
//
非
final
的引用类型方法参数
publicstaticvoid
checkLoginInfo(LoginInfo login)
{
//
没有任何问题,但是肯定不符合此参数存在的初衷
login =
new
LoginInfo();
//do something
}
|
程序的确是人写的,但是为了程序的灵活性,高效性,程序员不能只为了自己的一时想法写代码。而应该联系以后程序的扩展,维护等。所以应该考虑
一下参数的标明。