Java final修饰形参

转自:http://java.chinaitlab.com/base/836044.html

public class BB{

  public int i;

}

public class PP{

  public static void f(final BB ref) //我的理解是无法修改ref
 {
   ref.i = 55;
  }

  public static void main(String args[]){

   BB x = new BB();
   f(x);
   System.out.println(x.i); //但事实上是修改了。。。,不知为什么????
  }
}

  final修饰基本类型(int,double,...)时值不能改变:例final int a = 6;a 的值就是6,不能改.
  修饰引用类型时,是把引用的地址不能改变,但所引用的对象的值可以改变,

 就像上面举的那个例子:
  如果你想改变ref的引用地址是错误的.如:ref = new BB();是错的,但可以改变ref引用对象的值,如ref.i = 2;

总结:对于基本类型,不可变指的是值;
    对于引用类型,不可变指的是引用地址

读者自己的实验:

package com.horizon;

import java.util.HashMap;
import java.util.Map;

public class Hello {
    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("key1", "00");
        new Hello().change01(map);
        System.out.println(map.get("key1"));
        new Hello().change02(map);
        System.out.println(map.get("key1"));
    }

    public void change01(Map<String, Object> map) {
        map.put("key1", "_01");
    }

    public void change02(final Map<String, Object> map) {
        map.put("key1", "_02");
    }

}
原文地址:https://www.cnblogs.com/tv151579/p/3293188.html