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
      }
 
  • 24
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
Java,类的成员变量使用`final`修饰方法参数使用`final`修饰有以下区别: 1. 类的成员变量使用`final`修饰: - `final`修饰的成员变量表示该变量是一个常量,一旦被赋值后就不能再修改。 - `final`成员变量必须在声明时或构造函数进行初始化,且不能再被赋新值。 - `final`成员变量在整个类的生命周期保持不变,具有只读的特性。 2. 方法参数使用`final`修饰: - `final`修饰方法参数表示该参数方法内部不能再被修改。 - `final`参数主要用于保护方法内的参数值不被修改,一旦参数被赋值后,在方法不能修改其值,避免了不经意间修改参数的风险。 - `final`参数通常用于提高代码的可读性和安全性。 一般情况下,对类的成员变量使用`final`修饰的情况包括: - 常量:当一个变量在整个类都不应该被修改时,可以使用`final`修饰,使其成为一个常量。 - 线程安全:当多个线程访问同一个对象时,通过将共享的成员变量声明为`final`可以确保其在多线程环境下的安全性。 - 优化性能:编译器对`final`变量进行优化,可以提高程序的执行效率。 而对方法参数使用`final`修饰的情况包括: - 明确参数只用于读取,不应该被修改。 - 提高代码可读性,使方法的行为更加明确和可预测。 - 防止不经意间修改参数值,确保方法逻辑正确性和稳定性。 需要注意的是,使用`final`修饰并不是必须的,而是根据具体情况来考虑是否需要使用`final`来增加代码的可读性、安全性和性能优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值