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
      }
相關文章
相關標籤/搜索