java中的final与可变类型、不可变类型的关系
如果你对final和不可变类型的概念与区别有疑问的话,可以打开这篇文章。希望我的解答可以帮到您!
1.不可变类型:
什么是可变类型,什么是不可变类型呢?
首先我们看一下下面的这行代码:
String s=new String("a");
s=s+"b";
System.out.println(s);
只要你懂得一点java,那么你一定可以推测出最后的结果是“ab”。
但是,事情其实并没有那么简单。如果你debug这三行代码,会发现一个“微不足道”的变化:
对象s的id值在s=s+"b"执行过后发生了变化!
但是,只有不同的对象才有不同的id值啊?
是的,没错,你又创建了一个新的对象。如下图所示:

s的引用指向了另一个对象。这两个String对象的id值不同,字符串也不同。这就是不可变类型的最重要特征:首次确定,不可更改。
好了,现在再给出不可变类型的定义吧。
所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。
2.可变类型:
接下来来看一下与之相对应的可变类型:
StringBuilder s=new StringBuilder("a");
s.append("b");
System.out.println(s);
还是输出字符串,最后的结果还是“ab”,但是,再次debug,你会发现对象s的id值没有任何变化。
唉?这和前面那个String类好像不一样啊?这次居然直接修改了对象s中的字符串,而不是再创建一个对象。

是的,这就是可变类型的最重要特征:重复修改。
可变类型比不可变类型要多。相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。
3.final关键字:
final关键字有多种适用条件。第一种用法,修饰变量:
final int a=1;
此后变量变常量,a不能等于除1之外的其他值。
事实上,final也可以用来修饰对象,一经确定,这个对象就不会有第二个:
final String s=new String("a");
那么我们此时就会遇到一个问题,有final修饰的可变类型与不可变类型是否会有区别呢?
答案是肯定的。举例如下:
final String s=new String("a");
s=s+"b";
如果你试图输入上述的代码,编译器会在第二行告诉你一个语法错误。这是为什么呢?
上面提到了一个概念:一经确定,这个对象就不会有第二个。也就是说,你的引用s已经和字符串为“a”的对象锁死了。
而你在第二行却通过引用s创建了一个新的对象,这哪里行?和上面黑体字矛盾了。
举个形象的例子:一对夫妻已经结婚了,肯定是不允许谈第二个的呀。
但是,下面这个代码确实是可以运行的:
final StringBuilder s=new StringBuilder("a");
s.append("b");
这是为什么呢?不是说一经确定,这个对象就不会有第二个吗?的确如此!
对象还是那个对象,但是对象是自身可变的类型!所以下面的操作是被允许的。
总之,想要搞清楚上述的关系,建议多跑一跑代码了,希望这篇文章能帮到您!
java中的final与可变类型、不可变类型的关系的更多相关文章
- 浅析Java中的final关键字(转载)
自http://www.cnblogs.com/dolphin0520/p/3736238.html转载 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括 ...
- 浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- [转载]浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- 转载:浅析Java中的final关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...
- java中的final关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...
- 浅析Java中的final关键字(转)
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...
- 简单聊聊java中的final关键字
简单聊聊java中的final关键字 日常代码中,final关键字也算常用的.其主要应用在三个方面: 1)修饰类(暂时见过,但是还没用过); 2)修饰方法(见过,没写过); 3)修饰数据. 那么,我们 ...
- 浅谈Java中的final关键字
浅谈Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- 【转】浅析Java中的final关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...
- 浅析Java中的final关键字--转
转载自:http://www.importnew.com/18586.html#comment-581628 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关 ...
随机推荐
- Mybatis 实现批量插入和批量删除源码实例
Mybatis 实现批量插入数据和批量删除数据 学习内容: 准备工作 1.数据库新建表 2.新建 Maven 项目和设置编译版本及添加依赖 3.新建 db.properties 4.新建 mybati ...
- MVVM模式-数据的双向绑定
- 文档声明(Doctype)和<!Doctype html>有何作用? 严格模式与混杂模式如何区分?它们有何意义?
文档声明的作用: 文档声明是为了告诉浏览器,当前HTML文档使用什么版本的HTML来写的,这样浏览器才能按照声明的版本来正确的解析. <!doctype html> 的作用就是让浏览器进入 ...
- Bugku的exec执行绕过
题目 思路 1. 打开网页显示403 2. 回去看题目有提示 3. 不用多说,网页访问. 4. 第一行说要传个参数ip,试一下get传参?ip=127.0.0.1 5. 试下 ① 算术运算符 & ...
- 不用关闭重启cad及不用更改快捷方式或者版本号c#调试cad插件
c#开发的cad插件需要重启cad才能进行调试,然而高版本的cad启动比较慢特别是一些古董电脑,而且cad有重启次数限制.针对不用重启cad调试已经有成熟的方案了,但是需要调试一次修改一次快捷方式或者 ...
- 记录:替换线上springboot项目可执行jar包中依赖jar里的class文件
问题背景: 项目组发现线上版本问题后,定位是由于项目依赖的某个jar包中有个小BUG. 解决方案: 在修改了对应的java文件后,编译出对应的class文件.从生产环境下载项目jar包,解压后,找到对 ...
- 初识ES6(JavaScript)
初识ES6(JavaScript) 关于ES6: ES6即ECMAScript6,是一种规范,JavaScript遵循了这种规范. *优点:*代码比较简洁. *缺点:*浏览器的兼容性不好. 1.变量和 ...
- Go语言 文件操作
@ 目录 引言 1. 打开和关闭文件 2. 读取文件 2.1 defer 语句 2.2 手动宕机处理 2.3 打开文件并获取内容 2.4 bufio 读取文件 2.5 ioutil 读取文件 2.6 ...
- 3.1 常用Linux命令
1.echo命令 echo命令用于在终端设备上输出字符串或变量提取后的值,语法格式为"echo [字符串] [$变量]". 2.date命令 date命令用于显示或设置系统的时间与 ...
- 树莓派开发笔记(十三):入手研华ADVANTECH工控树莓派UNO-220套件(二):安装rtc等驱动
前言 前面运行了系统,本篇是安装对应套装的驱动,使rtc等外设生效,树莓派本身是不带rtc外设的. UNO-220-P4N1AE 驱动下载 官方下载:https://www.advan ...