一、变量的改变

变量的改变分为两种:

1) 改变一个变量:将该变量指向另一个值的存储空间。

类似于C语言中的指针操作:p = &a;

2) 改变一个变量的值:将该变量当前指向的值的存储空间中写入一个新的值。

类似于C语言中的指针操作:*p = b;

二、不可变性与可变性

2.1 概念

不变数据类型:一旦被创建,其值不能改变。

引用类型的不变性:一旦确定其指向的对象,不能再被改变。

基本数据类型都是不变数据类型,而对象数据类型分为可变与不可变。

不变数据类型的对象:一旦被创建,始终指向同一个值/引用

可变数据类型的对象:拥有方法可以修改自己的值/引用

2.2 举例String与StringBuilder

2.2.1 String

String是一个典型的不可变类型。String类型的对象一旦被创建,它内部的值就不可改变了。

但是我们在实际编程中会写如下代码,这里s的值不是改变了吗?

String s = "a";
s = s.concat("b"); //s += "b"

实际上在这个例子中改变的并不是s的值,而是s这个变量本身,即它的指向。我们用snapshot diagram描述上述过程如下:

值为"a"的对象在创建后就不可变了,s只是保存了这个对象的首地址,当s的"值"改变时,要新建一个值为"ab"的对象,再将s指向新创建的对象。在这一过程中String对象保持不可变性。

2.2.2 StringBuilder

StringBuilder是与String相对应的可变数据类型,也能表示字符串。

以下是与上一小节同义的代码:

StringBuilder sb = new StringBuilder("a");
sb.append("b");

该过程的snapshot diagram如下:

我们能看到sb没有指向其它对象,而是将现指向的对象中的值改成"ab"。

三、final

在编程过程中,我们可以使用关键词final去声明某引用是不可变的。

final Person a = new Person("Ross");
a = new Person("Jack");

当我们写完上述代码,程序会报错,因为我们改变了a的引用,而a被final修饰,这种引用改变是不合法的。 这种错误检测属于静态类型检查。

以下是final的几种用法:

1) 修饰类,被修饰类无法派生子类。

2) 修饰变量:变量无法改变值/引用。

3) 修饰方法:方法无法被子类重写。

对可变性与不可变性的总结相关推荐

  1. 业务的可变性和不可变性分析_不可变性真的意味着线程安全吗?

    业务的可变性和不可变性分析 我经常阅读有关"如果对象是不可变的,则它是线程安全的"的文章. 实际上,我从未找到过一篇使我相信不可变意味着线程安全的文章. 即使是Brian Goet ...

  2. python字符串不可改变怎么理解_python的“不可变性”代表了什么?

    在python中,每一个对象都可以分为不可变性或者可变性. 不可变性可以用来保证在程序中保持一个对象的固定不变. 一个具有"不可变性"的对象,是一个在其创建以后不能够被改变的对象. ...

  3. Java String的不可变性

    String是Java中比较特殊的一个类,特殊就在于它具有不可变性.这篇文章主要讲Sring的不可变性的具体体现.实现原理.原因以及与之相关的编程实践. 1.不可变性与可变性 有不可变性那么肯定就有可 ...

  4. Rust的所有权与可变性

    Rust与其他语言的比较 文章目录 Rust与其他语言的比较 特性 所有权 直接转移 间接转移 引用.借用 可变性与不可变性 特性 所有权 在Rust中,若声明有类似于Java或C++中的引用传递类型 ...

  5. Swift 值类型和引用类型的内存管理

    1.内存分配 1.1 值类型的内存分配 在 Swift 中定长的值类型都是保存在栈上的,操作时不会涉及堆上的内存.变长的值类型(字符串.集合类型是可变长度的值类型)会分配堆内存. 这相当于一个 &qu ...

  6. 30天python开发_30天解锁Python量化开发——初探交易接口

    python基础,详见我的专栏Python核心笔记​www.zhihu.com 下载Anaconda与Jupyter,很多代码需要在Jupyter上演示 CTP接口有行情接口(CtpMdApi),交易 ...

  7. 如何将某个groupbox中的数据赋值到另一个groupbox_React中的数据和数据流

    第2章大致介绍了React.我们花了些时间学习了React,了解它的设计和API背后的一些概念,我们甚至还逐步说明了如何用React组件构建一个简单注释框.在第4章中,我们将开始更全面地使用组件并开始 ...

  8. 三、值类型与引用类型

    说点别的 这是<关于 JavaScript 你必须要知道的 33 个概念 >系列的第三篇文章,今天稍微给大家介绍下这个系列. 如今前端的发展日新月异,很多人(包括我)都是追逐着一些流行的框 ...

  9. python如何查看源码_查看“Python-2020-fall”的源代码

    因为以下原因,您没有权限编辑本页: 您所请求的操作仅限于该用户组的用户使用:用户 您可以查看与复制此页面的源代码.== Python程序设计课程主页(2020年秋季学期) == Teacher: [h ...

最新文章

  1. hostapd中扫描的调用过程
  2. 永远的Hello World
  3. 配置bitnami-redmine自带的Subversion
  4. 《数据库SQL实战》获取所有部门当前manager的当前薪水情况
  5. 使用Spark Streaming SQL基于时间窗口进行数据统计
  6. MySQL安装叫重启_MySQL重启命令和MySQL数据库安装目录的操作过程
  7. 原生js循环展示dom_为什么说JS的DOM操作很耗性能
  8. Android SDK4.0(api14)安装
  9. Servlet中将JavaBean对象传递到JSP页
  10. java batik 字体文件_java使用batik转换svg文件-Go语言中文社区
  11. 人工智能是一个骗局?
  12. 三维模型转换html,三维模型查看器转换软件FinalMesh Professional 1.2.0.329 Pro | C4DSKY...
  13. 雷丁CAN通讯信号上位机软件
  14. 解决python使用gmail smtp服务发邮件报错smtplib.smtpauthentic
  15. 教育网看高清世界杯方法
  16. repo的安装和使用
  17. pytorch Bus error (core dumped)
  18. [原创翻译]RFC1619 PPP over SONET/SDH
  19. 区块链是新的 Linux 而非新的互联网
  20. springBoot Admin整合nacos

热门文章

  1. 编程式事务和声明式事务浅析
  2. 2016年Linux下五个最佳视频编辑软件
  3. 【重新定义matlab强大系列三】MATLAB清洗离群数据(查找、填充或删除离群值)
  4. SCAU 2018 初出茅庐 题解
  5. 分析:人名搜索Spock会成下个谷歌吗
  6. MySQL DQL查询
  7. 列表/元组/切片/字典/字符串处理方法
  8. html语言登黄鹤楼,七言律诗:登黄鹤楼
  9. C++ STL函数 queue (henu.hjy)
  10. 河南省多校联盟二-C