理解值和对象-快照图
快照圖(Snapshot diagrams)能代表程序運(yùn)行時的各種狀態(tài)——它的棧(即方法和局部變量)和它的堆(即現(xiàn)在存在的對象)。
具體來講,使用快照圖有以下優(yōu)點(diǎn):
- 在課堂上和會議上與同學(xué)交流
- 解釋一些概念例如原始類型 vs. 對象類型不可更改的值 vs. 不可更改的引用, 指針別名, stack棧 vs. 堆heap, 抽象表達(dá) vs. 具體表達(dá).
- 能夠幫助你解釋你的工程的設(shè)計思想
- 為以后的課程做鋪墊(例如MIT 6.170中的對象模型)
雖然這些圖像都只是解釋Java中的一些概念,但是很多都可以延伸到別的現(xiàn)代語言中,例如Python, JavaScript, C++, Ruby.
原始值
原始值都是以常量來表達(dá)的。上面箭頭的來源可以是一個變量或者一個對象的內(nèi)部區(qū)域(field)。
對象值
一個對象用一個圓圈表示。對象內(nèi)部會有很多區(qū)域(field),這些區(qū)域又指向它們對應(yīng)的值。同時這些區(qū)域也是有它們的類型的,例如int x?。
可更改的值 vs. 可被重新賦值的改變
通過快照圖我們可以視圖化可更改的值和可被重新賦值的改變之間的區(qū)別:
- 當(dāng)你給一個變量或者一個區(qū)域(filed)賦值的時候,你實(shí)際上是改變了它指向的方向,即指向了另一個值。
- 當(dāng)你修改一個可被更改的(mutable)值的時候——例如數(shù)組或者列表——你真正修改了這個值本身(譯者注:變量或者區(qū)域的指向并沒有變)
重新賦值和不可改變的(immutable)值
例如,如果我們有一個?String?變量?s, 我們可以將它從?"a"?賦值為?"ab".
String s = "a"; s = s + "b";String?就是一種不可改變的(immutable)值,這種類型的值在第一次確定后就不能改變。不可改變性是我們這門課程的一個重要設(shè)計原則,以后的課程中會詳細(xì)介紹的。
不可更改的對象(設(shè)計者希望它們一直是這個值)在快照圖中以雙圓圈的邊框表示,例如上面的字符串對象。
可更改的(mutable)值
與此相對應(yīng)的,?StringBuilder?(Java的一個內(nèi)置類) 是一個可更改的字符串對象,它內(nèi)置了許多改變其內(nèi)容的方法:
StringBuilder sb = new StringBuilder("a"); sb.append("b");可更改性和不可更改性(mutability and immutability)將會對我們的“安全健壯性”目標(biāo)起到重要作用。
不可更改的引用
Java也提供了不可更改的引用:final聲明,變量一旦被賦值就不能再次改變它的引用(指向的值或者對象)。
final int n = 5;如果Java編譯器發(fā)現(xiàn)final聲明的變量在運(yùn)行中被賦值多次,它就會報錯。所以final就是為不可更改的引用提供了靜態(tài)檢查。
在快照圖中,不可更改的引用(final)用雙箭頭表示,例如上圖中的id,Person的id引用不可改變,但是age卻是可改變的。
這里要特別注意一點(diǎn),final只是限定了引用不可變,我們可以將其引用到一個可更改的值?(例如final StringBuilder sb?),雖然引用不變,但引用的對象本身的內(nèi)容可以改變。
同樣的,我們也可以將一個可更改的引用作用到一個不可更改的值(例如String s?),這個時候變量值的改變就是將引用改變。
?
轉(zhuǎn)載于:https://www.cnblogs.com/zdj-/p/8494316.html
總結(jié)
以上是生活随笔為你收集整理的理解值和对象-快照图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个地址或二维码自动识别设备,并跳转到各
- 下一篇: Dapper+SqlServerCe部署