在面向对象的系统中,存在可变对象(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)也都是不可变的。

【面向对象】可变对象和不可变对象相关推荐

  1. python哪些是可变对象_什么是Python可变对象和不可变对象

    什么是Python可变对象和不可变对象 发布时间:2020-07-22 09:59:15 来源:亿速云 阅读:60 作者:Leah 这篇文章运用简单易懂的例子给大家介绍什么是Python可变对象和不可 ...

  2. python基础教程:对可变对象和不可变对象的详解

    数据类型分为可变.不可变.可变对象表示可以原处修改该数据对象,不可变对象表示必须创建新对象来保存修改后的数据. 在基础数据类型中: 数值.字符串.元组.frozenset是不可变对象 列表.set.d ...

  3. python的可变对象和不可变对象

    说明 在python中处处皆对象,那么具体细分又可以分为可变类型和不可变类型对象,今天来详细讨论一下. is 和 == 的区别 先提前说一下is和==的区别以帮助理解. is是判断两者是否属于同一内存 ...

  4. Objective-C:OC内部可变对象和不可变对象的深(复制)拷贝问题思考:

    OC内部:可变对象和不可变对象的深(复制)拷贝问题思考: 不可变对象: 例如NSString对象,因为NSString对象是常量字符串,所以,不可以更改其内容,但是可以修改指向该字符串的指针指向.当对 ...

  5. python中、变量指向的对象可以发生变化吗_python中的引用传递,可变对象,不可变对象,list注意点...

    python中的引用传递 首先必须理解的是,python中一切的传递都是引用(地址),无论是赋值还是函数调用,不存在值传递. 可变对象和不可变对象 python变量保存的是对象的引用,这个引用指向堆内 ...

  6. python可变对象 不可变对象_【Python】可变对象和不可变对象

    在 Python 中一切都可以看作为对象.每个对象都有各自的 id, type 和 value. id: 当一个对象被创建后,它的 id 就不会在改变,这里的 id 其实就是对象在内存中的地址,可以使 ...

  7. python可变对象与不可变对象_python 可变对象与不可变对象

    一.原理 可变对象:list dict set 不可变对象:tuple string int float bool 1. python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定 ...

  8. python中不可变对象_Python中的可变对象与不可变对象、浅拷贝与深拷贝

    Python中的对象分为可变与不可变,有必要了解一下,这会影响到python对象的赋值与拷贝.而拷贝也有深浅之别. 不可变对象 简单说就是某个对象存放在内存中,这块内存中的值是不能改变的,变量指向这块 ...

  9. 可变对象 vs 不可变对象(Python)

    Python 在 heap 中分配的对象分成两类:可变对象和不可变对象.所谓可变对象是指,对象的内容是可变的,例如 list.而不可变的对象则相反,表示其内容不可变. 不可变对象:int,string ...

最新文章

  1. python判断点在四边形内
  2. mongodb 1安装,开启
  3. ASP.NET MVC+LINQ开发一个图书销售站点(9):编辑目录
  4. golang学习之旅(1)
  5. 报错curl: (7) Failed to connect to 127.0.0.1 port xxxx: Connection refused
  6. mysql数据库序列作用_MySQL 序列使用
  7. 当贝显示服务器生病,智能电视一直显示“缓冲中”是什么问题?当贝市场为你解答...
  8. Introduction to Computer Networking学习笔记(十一):flow control 滑动窗口详解
  9. java过滤关键字_java过滤敏感词汇
  10. 使用YYLabel做文本竖向展示
  11. 黑客教父郭盛华:提升家庭WiFi的10个方法
  12. ios 渐变透明背景_2019 - 渐变梯度
  13. 服务器名称指示(SNI)是什么东东?
  14. RN:分包/拆包技术调研
  15. 修复iPhone系统故障导致的黑屏
  16. html下拉框原理,html下拉框获取value属性
  17. 新绝代双骄3终极全攻略5
  18. GameObject在SetActive(false)隐藏后,其下脚本仍会运行
  19. android 9 预装可卸载的app,只安装一次
  20. QQ丐版(韩顺平Java多用户通信项目)

热门文章

  1. opencv图像处理时使用stringstream批量读取图片,处理后并保存
  2. 微信小程序开发之普通链接二维码
  3. 在linux上处理base64加密和解密
  4. Standard Driver Routines(标准驱动程序)
  5. [转载]XSS 攻擊常用腳本
  6. ${ctx} 的那些事
  7. CentOS安装Oracle12C
  8. eclipse实现Android登录功能,eclipse开发安卓登录
  9. java 异或_Javase第一部分:操作符的使用(按位异或运算)(含视频讲解)
  10. nagios mysql 监控_nagios监控mysql