如果你对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与可变类型、不可变类型的关系的更多相关文章

  1. 浅析Java中的final关键字(转载)

    自http://www.cnblogs.com/dolphin0520/p/3736238.html转载 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括 ...

  2. 浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  3. [转载]浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  4. 转载:浅析Java中的final关键字

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...

  5. java中的final关键字

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...

  6. 浅析Java中的final关键字(转)

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...

  7. 简单聊聊java中的final关键字

    简单聊聊java中的final关键字 日常代码中,final关键字也算常用的.其主要应用在三个方面: 1)修饰类(暂时见过,但是还没用过); 2)修饰方法(见过,没写过); 3)修饰数据. 那么,我们 ...

  8. 浅谈Java中的final关键字

    浅谈Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  9. 【转】浅析Java中的final关键字

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...

  10. 浅析Java中的final关键字--转

    转载自:http://www.importnew.com/18586.html#comment-581628 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关 ...

随机推荐

  1. EMS监控用户邮箱

    案例任务:部署日记规则,用户"王淑江"监控用户"王春海"的邮箱. 1.EMS监控用户邮箱 使用PowerShell命令完成任务:使用日记规则部署"王淑 ...

  2. javaScript设计模式:发布订阅模式

    发布订阅模式的思想是在观察者模式的基础上演变而来,在观察者模式中客户端监听到对象某个行为就触发对应任务程序.而在发布订阅模式中依然基于这个核心思想,所以有时候也会将两者认为是同一种设计模式.它们的不同 ...

  3. Mybatis-sql语句的抽取

    1.抽取之前的UserMapper.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...

  4. Visual Studio 打包和安装 exe

    # Visual Studio 打包和安装 exe > **小型项目(无复杂的库)** //VS2022 作为演示平台   > 1.解决方案配置 = Release   > 2.解决 ...

  5. 怎么快速找出帝国CMS数据库配置文件路径及迁移网站后修改技巧!

    首先,我们要了解一下帝国CMS整个目录结构,只有了解清楚结构,我们才有可能快速找到自己想要的文件,比如:帝国CMS数据库配置文件路径! 帝国CMS目录结构介绍 / 系统根目录├d/ 附件和数据存放目录 ...

  6. Java学习day9

    抽象类的关键字:abstract 类中有抽象方法时,需要在类名前也加上abstract关键字,即 public abstract class 类名{ } 同时,抽象类不能直接实例化,需要通过子类继承, ...

  7. 通过循环按行顺序为一个5×5的二维数组a赋1到25的自然数,然后输出该数组。试编程。

  8. Java语言学习day15--7月21日

    今日内容介绍1.Eclipse开发工具2.超市库存管理系统 ###01Eclipse的下载安装 * A: Eclipse的下载安装  * a: 下载 * http://www.eclipse.org ...

  9. 2021.08.09 P5018 对称二叉树(树形结构)

    2021.08.09 P5018 对称二叉树(树形结构) [P5018 NOIP2018 普及组] 对称二叉树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 求一棵子树,关 ...

  10. git-config配置多用户环境以及 includeIf用法

    git-config配置多用户环境以及 includeIf用法 git-config配置多用户环境以及 includeIf用法 背景 介绍 配置 栗子 背景 开发人员经常遇到这样的问题,公司仓库和个人 ...