Java 关于final那些事

先说结论:对于引用类型的变量,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
    }
}
原文地址:https://www.cnblogs.com/tengpan-cn/p/6437606.html