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
}
|