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
      }
相关文章
相关标签/搜索