JAVA方法中的参数用final来修饰的原因

 
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
      }
 
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值