理解值和对象-快照图
快照图(Snapshot diagrams)能代表程序运行时的各种状态——它的栈(即方法和局部变量)和它的堆(即现在存在的对象)。
具体来讲,使用快照图有以下优点:
- 在课堂上和会议上与同学交流
- 解释一些概念例如原始类型 vs. 对象类型不可更改的值 vs. 不可更改的引用, 指针别名, stack栈 vs. 堆heap, 抽象表达 vs. 具体表达.
- 能够帮助你解释你的工程的设计思想
- 为以后的课程做铺垫(例如MIT 6.170中的对象模型)
虽然这些图像都只是解释Java中的一些概念,但是很多都可以延伸到别的现代语言中,例如Python, JavaScript, C++, Ruby.
原始值
原始值都是以常量来表达的。上面箭头的来源可以是一个变量或者一个对象的内部区域(field)。
对象值
一个对象用一个圆圈表示。对象内部会有很多区域(field),这些区域又指向它们对应的值。同时这些区域也是有它们的类型的,例如int x
。
可更改的值 vs. 可被重新赋值的改变
通过快照图我们可以视图化可更改的值和可被重新赋值的改变之间的区别:
- 当你给一个变量或者一个区域(filed)赋值的时候,你实际上是改变了它指向的方向,即指向了另一个值。
- 当你修改一个可被更改的(mutable)值的时候——例如数组或者列表——你真正修改了这个值本身(译者注:变量或者区域的指向并没有变)
重新赋值和不可改变的(immutable)值
例如,如果我们有一个 String
变量 s
, 我们可以将它从 "a"
赋值为 "ab"
.
String s = "a";
s = s + "b";
String
就是一种不可改变的(immutable)值,这种类型的值在第一次确定后就不能改变。不可改变性是我们这门课程的一个重要设计原则,以后的课程中会详细介绍的。
不可更改的对象(设计者希望它们一直是这个值)在快照图中以双圆圈的边框表示,例如上面的字符串对象。
可更改的(mutable)值
与此相对应的, StringBuilder
(Java的一个内置类) 是一个可更改的字符串对象,它内置了许多改变其内容的方法:
StringBuilder sb = new StringBuilder("a"); sb.append("b");
可更改性和不可更改性(mutability and immutability)将会对我们的“安全健壮性”目标起到重要作用。
不可更改的引用
Java也提供了不可更改的引用:final
声明,变量一旦被赋值就不能再次改变它的引用(指向的值或者对象)。
final int n = 5;
如果Java编译器发现final
声明的变量在运行中被赋值多次,它就会报错。所以final
就是为不可更改的引用提供了静态检查。
在快照图中,不可更改的引用(final
)用双箭头表示,例如上图中的id
,Person
的id
引用不可改变,但是age却是可改变的。
这里要特别注意一点,final
只是限定了引用不可变,我们可以将其引用到一个可更改的值 (例如final StringBuilder sb
),虽然引用不变,但引用的对象本身的内容可以改变。
同样的,我们也可以将一个可更改的引用作用到一个不可更改的值(例如String s
),这个时候变量值的改变就是将引用改变。
转载于:https://www.cnblogs.com/zdj-/p/8494316.html
理解值和对象-快照图相关推荐
- java 对象图_Java对象内存图
2019-09-30 非原创 堆区 1.存储new出来的对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不 ...
- hashcode值一样对象一定相同吗_HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)...
1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...
- Java07-day07【类和对象、对象内存图、成员变量与局部变量、private、this、封装、构造方法】
java零基础入门到精通(2019版)[黑马程序员] 视频+资料:[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:zjxs] &qu ...
- Java面向对象思想、类的定义、对象的使用、对象内存图、成员变量和局部变量的区别、封装、private关键字、this关键字、构造方法、JavaBean-day06
目录 第1节 面向对象思想 1.1 面向对象思想概述 概述 举例 特点 1.2 类和对象 什么是对象 类与对象的关系 1.3 类的定义 事物与类的对比 类的定义格式 1.4 对象的使用 对象的使用格式 ...
- 透过V8深入理解JavaScript的对象
我们知道,V8是Chrome用来编译执行JavaScript的JavaScript引擎,所以如果我们要了解JavaScript,那么结合V8能让我们更好地理解,这篇博客将结合V8,来谈谈JavaScr ...
- 通过属性值从对象数组中获取JavaScript对象[重复]
本文翻译自:Get JavaScript object from array of objects by value of property [duplicate] This question alr ...
- C#基础知识1-深入理解值类型和引用类型
C#值类型和引用类型这个概念在刚学习的时候应该就知道了.但是我们并没有深入的去理解它.越是基础知识其实才是最有用的.对代码的优化,代码质量的提升都有帮助.通过整理本文章,对很多知识也起到了巩固的作用吧 ...
- python代码的层次结构_Python的object和type理解及主要对象层次结构
一.Object与Type 1.摘自Python Documentation 3.5.2的解释 Objects are Python's abstraction for data. All data ...
- DirectX12(D3D12)基础教程(四)——初识DirectXMath库、使用独立堆创建常量缓冲、理解管线状态对象、理解围栏同步
目录 1.前言及本章内容提要 2.初识DirectXMath库 3.使用独立堆创建常量缓冲 4.理解管线状态对象 5.理解围栏同步 6.完整代码 1.前言及本章内容提要 经过了之前3篇教程的跨度有点大 ...
最新文章
- WordPress页面Page和文章Post的相互转换
- HAproxy七层负载均衡——环境搭建及实现过程详解
- 13.5 常见Random类
- 硬编码学习笔记(二)—— 经典变长指令
- oracle mysql 数据验证工具_Oracle Orion tool check io(ORACLE Orion 工具查看以及校验IO)
- 隐马尔科夫模型(Hidden Markov Models) 系列之五
- 看漫画学python 豆瓣_看漫画就能学好python?
- Colaboratory下载Kaggle数据
- Day07-函数(2)
- 设置环境变量ANDROID_SDK_HOME有什么用?
- 局域网通讯工具_五大核心开启工业通讯创新之门——西门子工业网络专家计划打造最强行业生态...
- 一图讲解一条sql语句的一生——《收获,不止Oracle》的读书笔记01
- CSAPP阅读进度日记
- 如何设置计算机的网络参数,如何正确设置电脑的IP地址和DNS等参数[图文]
- 看电影(movie):组合数
- 中国人工智能趋势报告(完整版)
- php网站源码 一品资源网,一品资源网自用官网模板源码下载站(带手机模板)...
- oracle应付创建会计科目,求助: EBSR12应付发票取消后创建不成会计科目
- MySQL查询不同年份母亲节_日期习俗大不同 走近七个国家的母亲节
- C# Word脚注和交叉引用功能