本文內容來自MIT6.031課程,源地址http://web.mit.edu/6.031/www/sp18/classes/02-basic-java/
Snapshot diagrams(快照圖)
? 對正在運行時runtime
的程序繪制一張快照對我們分析細節上微妙的問題是十分有用的。Snapshot diagrams
代表了程序在運行時的內部狀態—程序的棧(方法和本地變量)和程序的堆(當前存在的對象)。
以下是我們在6.031課程中使用Snapshot diagram
的原因:
用圖片與對方交流(在課堂上和在小組討論中)
能夠用圖解的方式說明基本類型和對象類型,不可變值和不可變應用,指針別名,棧和堆,抽象表示和具體表示的概念
幫助你解釋你的小組項目設計
-
為后面課程中更豐富的設計鋪平道路。比如在6.170中快照圖
歸納為對象模型(?)
盡管這個圖在這個課程中用于Java,但是這種記號法可以用于任何現代編程語言,比如,python,js,C++,ruby。
下面分別介紹不同類型的快照圖表示
Primitive values(原始值)
原始值直接用內容表示。使用引入箭頭表示從一個變量或對象中引用原始值。Object values(對象值)
一個對象值是一個用標簽標注對象類型的圓圈。當我們想要表示更多細節時,我們將對象中的域的名字寫在圈里,并用箭頭指出域的值。如果想要表示更多細節,比如說域的類型,域可以包含它的類型。一些人喜歡寫x:int
而不是int x
,實際上兩種都是可以的。
Mutation values vs. reassigning variables(可變值與分配值)
快照圖能夠給我們提供一種方法來區分 改變一個變量 和 改變一個值 :
- 當你給一個變量或字段(域)賦值時,你改變了變量箭頭所指的位置。你可以將它指向一個不同的值。
- 當你給可變值(例如數字或列表)賦值時,你改變了這個可變值內部的引用。
Reassignment and immutable values(重新賦值和不可變值)
舉例來說,如果我們有個String
變量s
,我們可以將它的值從"a"
變為"ab"
。
String s = "a";
s = s + "b";
String
是一種immutable(不可變)類型,即一種一經創建便不可更改值的類型。Immutability(不變性)是這門課程的一個主要設計原則,我們將在以后討論這個。
Mutable values(可變量)
與上面相反,StringBuilder
(另一種Java內置的類)是一種mutable(可變的)對象,它表示一串字符,并且有方法可以改變對象的值。
StringBuilder sb = new StringBuilder("a");
sb.append("b");
上面兩張快照圖看起來很不一樣:關于可變性和不可變性的區別將會對我們的代碼safe from bugs(免于漏洞危險)起到重要的作用。
Immutable references(不可變引用)
Java也為我們提供了不可變引用:變量一旦被分配,就不會再重新被分配。為了使一個引用不再變化,就將它聲明關鍵字final
:
final int n = 5;
如果Java編譯器不確定你的final
變量在運行時只會被賦值一次(變量值在后面被改變),那么編譯器就會產生一個編譯錯誤。所以final
為不可變引用提供了static checking靜態檢查。
在一個快照圖中,一個不可變引用用一個雙線的箭頭表示。比如一個對象的id
不會變化,但是age
會變化,我們就用下面的圖來表示。
注意到我們可以用一個不可變引用指向一個可變值(例如final StringBuilder sb
),即使用final
聲明,sb
的值依然可變。