zoukankan      html  css  js  c++  java
  • 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
          }
  • 相关阅读:
    POJ 2136
    POJ 2121
    POJ 2127
    POJ 2126
    POJ 2109
    POJ 2105
    POJ 2101
    POJ 2075
    Uboot — 配置过程
    Uboot — 编译体验
  • 原文地址:https://www.cnblogs.com/gmq-sh/p/8431960.html
Copyright © 2011-2022 走看看