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
      }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM