对可变性与不可变性的总结
一、变量的改变
变量的改变分为两种:
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) 修饰方法:方法无法被子类重写。
对可变性与不可变性的总结相关推荐
- 业务的可变性和不可变性分析_不可变性真的意味着线程安全吗?
业务的可变性和不可变性分析 我经常阅读有关"如果对象是不可变的,则它是线程安全的"的文章. 实际上,我从未找到过一篇使我相信不可变意味着线程安全的文章. 即使是Brian Goet ...
- python字符串不可改变怎么理解_python的“不可变性”代表了什么?
在python中,每一个对象都可以分为不可变性或者可变性. 不可变性可以用来保证在程序中保持一个对象的固定不变. 一个具有"不可变性"的对象,是一个在其创建以后不能够被改变的对象. ...
- Java String的不可变性
String是Java中比较特殊的一个类,特殊就在于它具有不可变性.这篇文章主要讲Sring的不可变性的具体体现.实现原理.原因以及与之相关的编程实践. 1.不可变性与可变性 有不可变性那么肯定就有可 ...
- Rust的所有权与可变性
Rust与其他语言的比较 文章目录 Rust与其他语言的比较 特性 所有权 直接转移 间接转移 引用.借用 可变性与不可变性 特性 所有权 在Rust中,若声明有类似于Java或C++中的引用传递类型 ...
- Swift 值类型和引用类型的内存管理
1.内存分配 1.1 值类型的内存分配 在 Swift 中定长的值类型都是保存在栈上的,操作时不会涉及堆上的内存.变长的值类型(字符串.集合类型是可变长度的值类型)会分配堆内存. 这相当于一个 &qu ...
- 30天python开发_30天解锁Python量化开发——初探交易接口
python基础,详见我的专栏Python核心笔记www.zhihu.com 下载Anaconda与Jupyter,很多代码需要在Jupyter上演示 CTP接口有行情接口(CtpMdApi),交易 ...
- 如何将某个groupbox中的数据赋值到另一个groupbox_React中的数据和数据流
第2章大致介绍了React.我们花了些时间学习了React,了解它的设计和API背后的一些概念,我们甚至还逐步说明了如何用React组件构建一个简单注释框.在第4章中,我们将开始更全面地使用组件并开始 ...
- 三、值类型与引用类型
说点别的 这是<关于 JavaScript 你必须要知道的 33 个概念 >系列的第三篇文章,今天稍微给大家介绍下这个系列. 如今前端的发展日新月异,很多人(包括我)都是追逐着一些流行的框 ...
- python如何查看源码_查看“Python-2020-fall”的源代码
因为以下原因,您没有权限编辑本页: 您所请求的操作仅限于该用户组的用户使用:用户 您可以查看与复制此页面的源代码.== Python程序设计课程主页(2020年秋季学期) == Teacher: [h ...
最新文章
- hostapd中扫描的调用过程
- 永远的Hello World
- 配置bitnami-redmine自带的Subversion
- 《数据库SQL实战》获取所有部门当前manager的当前薪水情况
- 使用Spark Streaming SQL基于时间窗口进行数据统计
- MySQL安装叫重启_MySQL重启命令和MySQL数据库安装目录的操作过程
- 原生js循环展示dom_为什么说JS的DOM操作很耗性能
- Android SDK4.0(api14)安装
- Servlet中将JavaBean对象传递到JSP页
- java batik 字体文件_java使用batik转换svg文件-Go语言中文社区
- 人工智能是一个骗局?
- 三维模型转换html,三维模型查看器转换软件FinalMesh Professional 1.2.0.329 Pro | C4DSKY...
- 雷丁CAN通讯信号上位机软件
- 解决python使用gmail smtp服务发邮件报错smtplib.smtpauthentic
- 教育网看高清世界杯方法
- repo的安装和使用
- pytorch Bus error (core dumped)
- [原创翻译]RFC1619 PPP over SONET/SDH
- 区块链是新的 Linux 而非新的互联网
- springBoot Admin整合nacos