final 来修饰方法参数的原因

 
http://tdcq.iteye.com/blog/375609
很多人都说在 JAVA 中用 final 来修饰方法参数的原因是防止方法参数在调用时被篡改,其实也就是这个原因,但理解起来可能会有歧义,有的人认为是调用语句的地方的变量的实际值不会被修改,另一种理解就是仅在调用方法内部不能被修改。
实际上第一种理解是错误的,对于基本类型来说,用不用 final 来修饰都是一样的效果,如下面的代码:
Java代码  
  1. publicstaticvoid main(String hh[])   
  2.       {   
  3.             int i = 1;   
  4.             System.out.println(i);   
  5.             checkInt(i);   
  6.             System.out.println(i);   
  7.       }   
  8.       publicstaticvoid checkInt(finalint i)   
  9.       {   
  10.             i += 200;   
  11.       }  
publicstaticvoid main(String hh[])
      {
            int i = 1;
            System.out.println(i);
            checkInt(i);
            System.out.println(i);
      }
      publicstaticvoid checkInt(finalint i)
      {
            i += 200;
      }
你把checkInt()方法中的参数设成final和非final的效果是一样子的。
对于引用类型来说也是一样子的,用不用修饰都不会改变引用地址,而都可以改变引用变量的属性值。如下:
Java代码  
  1. publicstaticvoid main(String hh[])   
  2.      {   
  3.            LoginInfo login = new LoginInfo();   
  4.            login.setPassword("1235");   
  5.            login.setUserName("mygod");   
  6.            System.out.println("username:"+login.getUserName()+",password:"+login.getPassword());   
  7.            checkLoginInfo(login);   
  8.            System.out.println("username:"+login.getUserName()+",password:"+login.getPassword());   
  9.      }   
  10.        
  11.      publicstaticvoid checkLoginInfo(final LoginInfo login)   
  12.      {   
  13.            login.setUserName("yun");   
  14.      }  
 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");
      }
 对于第二种说法,是这个样子的,我给了这个参数,你只能用这个参数的值,你不能修改它,对于基本类型和引用类型是一样的,如下:
Java代码  
  1. //如果不是final 的话,我可以在checkInt方法内部把i的值改变(有意或无意的,   
  2.     //虽然不会改变实际调用处的值),特别是无意的,可能会引用一些难以发现的BUG   
  3.     publicstaticvoid checkInt(int i)   
  4.     {   
  5.           i = 200;//这样是可以的,不会编译出错的   
  6.           //do something   
  7.     }   
  8.   
  9.     //如果是final 的话,我可以在checkInt方法内部就没办法把i的值改变   
  10.     //可以完全避免上面的问题   
  11.     publicstaticvoid checkInt(finalint i)   
  12.     {   
  13.           i = 200;//这样是不可以的,会编译出错的   
  14.           //do something   
  15.     }   
  16.   
  17.     //final 的引用类型方法参数   
  18.     publicstaticvoid checkLoginInfo(final LoginInfo login)   
  19.     {   
  20.           login = new LoginInfo();//error,编译不过去   
  21.           //do something   
  22.     }   
  23.     //非final的引用类型方法参数   
  24.     publicstaticvoid checkLoginInfo(LoginInfo login)   
  25.     {   
  26.           //没有任何问题,但是肯定不符合此参数存在的初衷   
  27.           login = new LoginInfo();   
  28.           //do something   
  29.     } 

你可能感兴趣的:(final 来修饰方法参数的原因)