欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  Java

如何理解JAVA方法中的参数用final来修饰

程序员文章站 2022-05-14 16:57:20
...
本篇文章给大家带来的内容是关于如何理解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
      }

以上就是如何理解JAVA方法中的参数用final来修饰的详细内容,更多请关注其它相关文章!

相关标签: final,JAVA