【面向对象】可变对象和不可变对象
在面向对象的系统中,存在可变对象(mutable)和不可变对象(immutable)两种对象,本文基于Java语言进行对比分析。
顾名思义,可变对象是创建之后状态可以改变的对象,不可变对象则是创建之后状态不可改变的对象。
一个对象包含的内部使用的属性改变了,但从外部看对象的状态并没有改变,例如一个使用Memoization来缓存复杂计算结果的对象仍然被看作是不可变对象。
不可变对象有几个优点:
- 线程安全
- 易于理解
- 比可变对象有更高的安全性
在面向对象编程中,String以及其他的具体对象都被看作是不可变对象,以提高可读性和运行效率。
尽管String类声明中没有提供让它成为不可变对象的语法,但是String类没有提供方法去改变一个String包含的数据,而是返回一个新的对象,这就使得它是不可变的。
Java中关键字final用于声明原始数据类型和对象引用为不可变对象,但是它不能使对象本身变为不可变对象。
- 原始数据类型变量(int, long, short等)定义之后还可以再重新赋值,可以使用final阻止这样的赋值。
- 仅仅使用final关键字还不能让引用类型(reference types)成为不可变对象,final只能阻止重新赋值。
原始类型包装类(Integer、Long、Short、Double、Float、Character、Byte、Boolean)也都是不可变的。
【面向对象】可变对象和不可变对象相关推荐
- python哪些是可变对象_什么是Python可变对象和不可变对象
什么是Python可变对象和不可变对象 发布时间:2020-07-22 09:59:15 来源:亿速云 阅读:60 作者:Leah 这篇文章运用简单易懂的例子给大家介绍什么是Python可变对象和不可 ...
- python基础教程:对可变对象和不可变对象的详解
数据类型分为可变.不可变.可变对象表示可以原处修改该数据对象,不可变对象表示必须创建新对象来保存修改后的数据. 在基础数据类型中: 数值.字符串.元组.frozenset是不可变对象 列表.set.d ...
- python的可变对象和不可变对象
说明 在python中处处皆对象,那么具体细分又可以分为可变类型和不可变类型对象,今天来详细讨论一下. is 和 == 的区别 先提前说一下is和==的区别以帮助理解. is是判断两者是否属于同一内存 ...
- Objective-C:OC内部可变对象和不可变对象的深(复制)拷贝问题思考:
OC内部:可变对象和不可变对象的深(复制)拷贝问题思考: 不可变对象: 例如NSString对象,因为NSString对象是常量字符串,所以,不可以更改其内容,但是可以修改指向该字符串的指针指向.当对 ...
- python中、变量指向的对象可以发生变化吗_python中的引用传递,可变对象,不可变对象,list注意点...
python中的引用传递 首先必须理解的是,python中一切的传递都是引用(地址),无论是赋值还是函数调用,不存在值传递. 可变对象和不可变对象 python变量保存的是对象的引用,这个引用指向堆内 ...
- python可变对象 不可变对象_【Python】可变对象和不可变对象
在 Python 中一切都可以看作为对象.每个对象都有各自的 id, type 和 value. id: 当一个对象被创建后,它的 id 就不会在改变,这里的 id 其实就是对象在内存中的地址,可以使 ...
- python可变对象与不可变对象_python 可变对象与不可变对象
一.原理 可变对象:list dict set 不可变对象:tuple string int float bool 1. python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定 ...
- python中不可变对象_Python中的可变对象与不可变对象、浅拷贝与深拷贝
Python中的对象分为可变与不可变,有必要了解一下,这会影响到python对象的赋值与拷贝.而拷贝也有深浅之别. 不可变对象 简单说就是某个对象存放在内存中,这块内存中的值是不能改变的,变量指向这块 ...
- 可变对象 vs 不可变对象(Python)
Python 在 heap 中分配的对象分成两类:可变对象和不可变对象.所谓可变对象是指,对象的内容是可变的,例如 list.而不可变的对象则相反,表示其内容不可变. 不可变对象:int,string ...
最新文章
- python判断点在四边形内
- mongodb 1安装,开启
- ASP.NET MVC+LINQ开发一个图书销售站点(9):编辑目录
- golang学习之旅(1)
- 报错curl: (7) Failed to connect to 127.0.0.1 port xxxx: Connection refused
- mysql数据库序列作用_MySQL 序列使用
- 当贝显示服务器生病,智能电视一直显示“缓冲中”是什么问题?当贝市场为你解答...
- Introduction to Computer Networking学习笔记(十一):flow control 滑动窗口详解
- java过滤关键字_java过滤敏感词汇
- 使用YYLabel做文本竖向展示
- 黑客教父郭盛华:提升家庭WiFi的10个方法
- ios 渐变透明背景_2019 - 渐变梯度
- 服务器名称指示(SNI)是什么东东?
- RN:分包/拆包技术调研
- 修复iPhone系统故障导致的黑屏
- html下拉框原理,html下拉框获取value属性
- 新绝代双骄3终极全攻略5
- GameObject在SetActive(false)隐藏后,其下脚本仍会运行
- android 9 预装可卸载的app,只安装一次
- QQ丐版(韩顺平Java多用户通信项目)
热门文章
- opencv图像处理时使用stringstream批量读取图片,处理后并保存
- 微信小程序开发之普通链接二维码
- 在linux上处理base64加密和解密
- Standard Driver Routines(标准驱动程序)
- [转载]XSS 攻擊常用腳本
- ${ctx} 的那些事
- CentOS安装Oracle12C
- eclipse实现Android登录功能,eclipse开发安卓登录
- java 异或_Javase第一部分:操作符的使用(按位异或运算)(含视频讲解)
- nagios mysql 监控_nagios监控mysql