[MIT 6.031] Getting started with Java Reading 2

本文內容來自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(原始值)

原始值直接用內容表示。使用引入箭頭表示從一個變量或對象中引用原始值。
primitive values in snapshot diagram

Object values(對象值)

一個對象值是一個用標簽標注對象類型的圓圈。當我們想要表示更多細節時,我們將對象中的域的名字寫在圈里,并用箭頭指出域的值。如果想要表示更多細節,比如說域的類型,域可以包含它的類型。一些人喜歡寫x:int而不是int x,實際上兩種都是可以的。

object values in snapshot diagram

Mutation values vs. reassigning variables(可變值與分配值)

快照圖能夠給我們提供一種方法來區分 改變一個變量 和 改變一個值 :

  • 當你給一個變量或字段(域)賦值時,你改變了變量箭頭所指的位置。你可以將它指向一個不同的值。
  • 當你給可變值(例如數字或列表)賦值時,你改變了這個可變值內部的引用。
Reassignment and immutable values(重新賦值和不可變值)

舉例來說,如果我們有個String變量s,我們可以將它的值從"a"變為"ab"

String s = "a";
s = s + "b";
reassigning a variable

String是一種immutable(不可變)類型,即一種一經創建便不可更改值的類型。Immutability(不變性)是這門課程的一個主要設計原則,我們將在以后討論這個。

Mutable values(可變量)

與上面相反,StringBuilder(另一種Java內置的類)是一種mutable(可變的)對象,它表示一串字符,并且有方法可以改變對象的值。

StringBuilder sb = new StringBuilder("a");
sb.append("b");
mutating an object

上面兩張快照圖看起來很不一樣:關于可變性和不可變性的區別將會對我們的代碼safe from bugs(免于漏洞危險)起到重要的作用。

Immutable references(不可變引用)

Java也為我們提供了不可變引用:變量一旦被分配,就不會再重新被分配。為了使一個引用不再變化,就將它聲明關鍵字final

final int n = 5;

如果Java編譯器不確定你的final變量在運行時只會被賦值一次(變量值在后面被改變),那么編譯器就會產生一個編譯錯誤。所以final為不可變引用提供了static checking靜態檢查。

在一個快照圖中,一個不可變引用用一個雙線的箭頭表示。比如一個對象的id不會變化,但是age會變化,我們就用下面的圖來表示。

final reference is a double arrow

注意到我們可以用一個不可變引用指向一個可變值(例如final StringBuilder sb),即使用final聲明,sb的值依然可變。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,123評論 6 13
  • Swift1> Swift和OC的區別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,136評論 1 32
  • 關于本文,你可以得到如下信息:1、為什么讀書會讀不懂;2、該如何選擇跟自己相適應的書籍。很多人讀書時會遇到這樣一個...
    周讀札記閱讀 1,916評論 2 1
  • 今日家長會的主題活動之一就是閱讀計劃,雖然一直強調閱讀,但是一直不知道讀的具體情況。今天的課堂分析了中外的閱讀現狀...
    丫丫笑語閱讀 332評論 4 3
  • 2018-12-06 孫萍_9f82 2018-12-06 20:26·字數 1225·閱讀 9·日記本 風,在四...
    孫萍_9f82閱讀 128評論 0 1