先说结论:对于引用类型的变量,Java本身会创建两个东西,一个是对象本身,另一个是记录对象地址的一个int值,将引用类型的对象声明为final实际上是固定记录地址的那个int的值不能改变,如果通过某种途径改变了对象本身,那么对象也就变了!
看测试代码:
/* * Copyright (c) 2017. Panteng.Co.Ltd All rights reserved */ package com.pt.memo; import org.junit.Test; import java.util.HashMap; import java.util.Map; /** * @description * @author panteng * @date 17-2-24. */ public class FinalTest { @Test public void finalTest(){ final Map<String, String> map = new HashMap<String, String>(); map.put("test", "test1");//说明对象本身是可以改变的 //map = new HashMap<String, String>(); //此处编译错误,说明对象的引用是不可变的 Map<String, String> map2 = map; map2.put("test", "test2"); //此处会修改map的值,说明map2 和 map指向同一个对象 System.out.println(map.get("test")); map2 = new HashMap<String, String>(); //为map2设置一个新的引用,说明final 没有从map传递到map2,也就是只能在声明时指定final才起作用 map2.put("test", "test3"); System.out.println(map2.get("test")); //test3 System.out.println(map.get("test")); //test2 } }