被final关键字坑了
一直都傻傻的以为用final关键字定义的都是不可变的。没想到的是对基本类型来说,这是一直成立的。
但是对于final修饰的对象,仍然可以修改对象里面的对象和成员变量。不变的只是当前对象的地址。
昨天我还信誓旦旦的和被人说我用final修饰对象了,它是不可变的,它里面的数值是不会被修改的(其实是可以被修改的)!!!想想就觉得惭愧,特以此文告诫自己,在不明事情真相的情况下不要妄下结论。
对于基本类型,例如final int x=1,这时x是“真正的”不可变,即进行x=0会显示编译错误。(它里面没有存有其它对象。)
对于非基本类型,例如 final Date date = new Date(),这时进行date.setYear(2015)是不会有任何编译错误的。因为该对象的地址并未被修改。但是如果进行date = null,就会有编译错误,因为此时对象date的地址发生了变化。
用比较通俗的话来说就像:高富帅可以有N个朋友,但是只有一个老婆,这个老婆(对象)是不变的,但是老婆(对象)身上的其它对象(属性)穿什么衣服、用什么化妆品(对象)是会变化。
被final关键字坑了的更多相关文章
- PHP的final关键字、static关键字、const关键字
		
在PHP5中新增加了final关键字,它可以加载类或类中方法前.但不能使用final标识成员属性,虽然final有常量的意思,但在php中定义常量是使用define()函数来完成的. final关键字 ...
 - 浅析Java中的final关键字(转载)
		
自http://www.cnblogs.com/dolphin0520/p/3736238.html转载 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括 ...
 - final关键字(final是最终的)
		
final关键字(final是最终的) 1.final修饰特点 a.修饰类,类不能被继承 b.修饰变量,变量就变成了常量, 修饰基本数据类:final int num = 10; 修饰引用数据类型变量 ...
 - java中对final关键字的理解以及使用场景
		
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.
 - 关于Java中的final关键字
		
Java中的final关键字是用来限制用户行为的,说白了,就是用来限制我们这些程序员的.final可以用来修饰:变量.方法.类. 1)Java final variable final用来修饰变量时, ...
 - 关于java中final关键字与线程安全性
		
在Java5中,final关键字是非常重要而事实上却经常被忽视其作为同步的作用.本质上讲,final能够做出如下保证:当你创建一个对象时,使用final关键字能够使得另一个线程不会访问到处于" ...
 - 深入理解Java中的final关键字
		
Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...
 - 浅析Java中的final关键字
		
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
 - 浅析final 关键字
		
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...
 
随机推荐
- 2.docker常用命令
			
一.安装相关 #查看docker是否安装 rpm -q docker #CentOS下安装docker sudo yum install docker #启动 Docker systemctl s ...
 - springMVC源码--Controller控制器
			
springMVC给我们提供Controller控制器,用来实现我们的逻辑处理,在Controller接口中定义的方法也是比较简单的,如下: Controller接口及实现类:
 - mybatis映射器配置细则
			
前面三篇博客我们已经多次涉及到映射器的使用了,增删查基本上都用过一遍了,但是之前我们只是介绍了基本用法,实际上mybatis中映射器可以配置的地方还是非常多,今天我们就先来看看映射器还有哪些需要配置的 ...
 - SpringMVC+Spring+Mybatis整合,使用druid连接池,声明式事务,maven配置
			
一直对springmvc和mybatis挺怀念的,最近想自己再搭建下框架,然后写点什么. 暂时没有整合缓存,druid也没有做ip地址的过滤.Spring的AOP简单配置了下,也还没具体弄,不知道能不 ...
 - 拾遗与填坑《深度探索C++对象模型》3.2节
			
<深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...
 - 使用kprobes查看内核内部信息
			
前言:使用printk打印变量等方法,是调试内核的有效方法之一,但是这种方法必须重新构建并用新内核启动,调试效率比较低.以内核模块的方式使用kprobes.jprobes,就可以在任意地址插入侦测器, ...
 - pycallgraph 追踪Python函数内部调用
			
安装 安装pycallgraph 安装依赖 使用 待测脚本 追踪脚本 追踪结果 高级篇 隐藏私密函数 控制最大追踪深度 总结 GitHub上好代码真的是太多了,名副其实的一个宝藏.但是最近自己也反思了 ...
 - [django]用fastcgi部署
			
django官方已经开始弃用fastcgi来部署django应用了,作为以前使用过的用户,还是贴一个配置,用来做纪念吧.. 项目下 #! /bin/sh case "$@" in ...
 - ZAB协议
			
zookeeper依赖zab协议来实现分布式数据一致性.基于该协议,zookeeper实现了一种主备模式的系统架构来保持ZooKeeper为高可用的一致性协调框架,自然的ZooKeeper也有着一致性 ...
 - [ExtJS5学习笔记]第十九节 Extjs5中通过设置form.Panel的FieldSet集合属性控制多个field集合
			
本文地址:http://blog.csdn.net/sushengmiyan/article/details/39209533 官方例子:http://docs.sencha.com/extjs/5. ...