先说结论:对于引用类型的变量,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
}
}

Java 关于final那些事的更多相关文章

  1. Java关键字final、static

    一.final根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final ...

  2. java中final的理解

    final修饰变量表示变量初始化后就不能再改变. 一.对于基础类型来说,用final修饰后其值不可以改变. 1. final int a; a = 5; 2.final int a = 5; 二.对于 ...

  3. 【转】Java关键字final、static使用总结

    转自:http://lavasoft.blog.51cto.com/62575/18771/   Java关键字final.static使用总结   一.final        根据程序上下文环境, ...

  4. java的final用法

    转自:http://blog.163.com/maomaoyu_1012/blog/static/19060130520116269329894/ 1.         修饰基础数据成员的final ...

  5. Java关键字final、static使用总结

    Java关键字final.static使用总结   一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方 ...

  6. Java中final的作用

    Java中Final可以被用于变量,方法,类.具体来说: 1, Final 变量 修饰主类型时,制定变量为常数,不希望被改变 修饰类类型时,表示变量的句柄不变,不能被指定指向新的变量 修饰参数时,参数 ...

  7. 转!Java关键字final、static使用总结

    Java关键字final.static使用总结   一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可 ...

  8. Java关键字final、static使用总结(转)

    Java关键字final.static使用总结   一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方 ...

  9. (转)Java关键字final、static使用总结

    一.final  根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. fin ...

随机推荐

  1. ios应用,64位问题,Missing 64-bit support

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmFyb25fYmxvZ3M=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  2. MySQL文件和Innodb引擎文件

    构成MySQL数据库和InnoDB存储引擎表的各种类型文件,组要有以下文件 参数文件:告诉MySQL实例启动时在哪里可以找到,数据库文件,并且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置 ...

  3. Android无线测试之—UiAutomator UiSelector API介绍之八

    对象搜索—特殊属性.节点与资源ID 一.特殊属性定位对象相关API 返回值 API 描述 UiSelector checkableboolean val) 是否可选择,一般开关组件上具有checkab ...

  4. Android无线测试之—UiAutomator工程建立

    一.环境要求: 已经搭建好了Android UiAotomator测试环境 二.新建测试工程: 1.打开eclipse,首次打开指定一个工作空间 2.新建一个Java Project,名叫:Demo1 ...

  5. coreData笔记

    1.    CDVehicle *vehicle = (CDVehicle *)[[NSManagedObject alloc] initWithEntity:entity insertIntoMan ...

  6. python 数学操作符

    优先级从高到低 print("2 ** 3 = %d" % 2 ** 3) 2 ** 3 = 8print("7 % 2 = {}".format(7 % 2) ...

  7. 【BZOJ4724】[POI2017]Podzielno 数学+二分

    [BZOJ4724][POI2017]Podzielno Description B进制数,每个数字i(i=0,1,...,B-1)有a[i]个.你要用这些数字组成一个最大的B进制数X(不能有前导零, ...

  8. 在Visual Studio 2015的Cordova项目中使用Gulp

    之前一直是在vs 2013中使用Cordova来开发移动app(目前有iPad版/iPhone版/安卓版),准备到下一个milestone的时候升级到2015,这两天在尝试各种东西. 2015中的co ...

  9. redo binlog

    w https://dev.mysql.com/doc/refman/5.7/en/innodb-redo-log.html https://dev.mysql.com/doc/refman/5.7/ ...

  10. cxGrid时间格式与导出Excel

    引用cxFormats单元: ShortDateFormat := 'dd/mm/yyyy'; DateSeparator := '/'; cxFormatController.UseDelphiDa ...