转自: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"); } }