【正文】
orage is turning the objects into something that can exist on the other medium, and yet can be resurrected into a regular RAMbased object when necessary. Java provides support for lightweight persistence, and future versions of Java might provide more plete solutions 第 10 頁 for persistence. Highprecision numbers Java includes two classes for performing highprecision arithmetic: Big Integer and Big Decimal. Although these approximately fit into the same category as the “wrapper” classes, neither one has a primitive analogue. Both classes have methods that provide analogues for the operations that you perform on primitive types. That is, you can do anything with a Big Integer or Big Decimal that you can with an int or float, it?s just that you must use method calls instead of operators. Also, since there?s more involved, the operations will be slower. You?re exchanging speed for accuracy. Big Integer supports arbitraryprecision integers. This means that you can accurately represent integral values of any size without losing any information during operations. Big Decimal is for arbitraryprecision fixedpoint numbers。 摘自: 王瑞 著 . C++數(shù)據(jù)庫系統(tǒng)開發(fā)詳解 [M].北京:電子工業(yè)出版社. 2020. 第 7頁 附:英文原文 Everything is an Object Wang Rui Although it is based on C++, Java is more of a “pure” objectoriented language. Both C++ and Java are hybrid languages, but in Java the designers felt that the hybridization was not as important as it was in C++. A hybrid language allows multiple programming styles。隨后,它會(huì)自動(dòng)釋放由那些閑置對(duì)象占據(jù)的內(nèi)存,以便能由新對(duì)象使用。假如 Java 讓對(duì)象依然故我,怎樣才能防止它們大量充斥 內(nèi) 存,并最終造成程序的 “凝固 ”呢。這個(gè)編程問題在 C 和 C++里特別突出。然而, s 指向的 String 對(duì)象依然占據(jù)著內(nèi)存空間。但這種做法在Java 里是不允許的 。 在上面的例子中,縮進(jìn)排版使 Java 代碼更易辨讀。 作用域 大多數(shù)程序設(shè)計(jì)語言都提供了 “作用域 ”( Scope)的概念。同樣地,編譯器能夠擔(dān)保對(duì)它的初始化,因?yàn)闀?huì)將那個(gè)數(shù)組的內(nèi) 存 劃分成零。正式使用前,必須為每個(gè)句柄都分配一個(gè)對(duì)象。為此付出少許代價(jià)是值得的。所以在 C 和 C++里困擾程序員的許多問題都未在 第 5頁 Java 里重復(fù)。 ( 4) Java 的數(shù)組 幾乎所有程序設(shè)計(jì)語言都支持?jǐn)?shù)組。也就是說,我們可精確表示任意大小的整數(shù)值,同時(shí)在運(yùn)算過程中不會(huì)丟失任何信息。只是必須使用方法調(diào)用,不能使用運(yùn)算符。 ( 3) 高精度數(shù)字 Java 增加了兩個(gè)類,用于進(jìn)行高精度的計(jì)算: Big Integer 和 Big Decimal。對(duì)于這些類型的數(shù)據(jù)存儲(chǔ),一個(gè)特別有用的技巧就是它們能存在于其他媒體 中。其中兩個(gè)最主要的例子便是 “流式對(duì)象 ”和 “固定對(duì)象 ”。這樣做是安全的,因?yàn)樗鼈冇肋h(yuǎn)都不會(huì)改變??捎?static 關(guān)鍵字指出一個(gè)對(duì)象的特定元素是靜態(tài)的。執(zhí)行這 第 4頁 些代碼時(shí),會(huì)在堆里自動(dòng)進(jìn)行數(shù)據(jù)的保存。一種常規(guī)用途的內(nèi)存池(也在 RAM 區(qū)域),其中保存了 Java 對(duì)象。創(chuàng)建程序時(shí), Java 編譯器必須準(zhǔn)確地知道堆棧內(nèi)保存的所有數(shù)據(jù)的 “長度 ”以及 “存在時(shí)間 ”。 堆棧。有六個(gè)地方都可以保存數(shù)據(jù): 寄存器。對(duì)我們來講,最重要的就是記住 能自行創(chuàng)建類型。所以在上面的例子中,可以說: String s = new String(asdf)。 ( 2) 所有對(duì)象都必須創(chuàng)建 。這是由于 s 實(shí)際并未與任何東西連接(即 “沒有電視機(jī) ”)。也就是說,只是由于擁有一個(gè)句柄,并不表示必須有一個(gè)對(duì)象同它連接。只要握住這個(gè)遙控板,就相當(dāng)于掌握了與電視機(jī)連接的通道。因此,我們可采用一種統(tǒng)一的語法,任何地方均可照搬不誤。 (1) 用句柄操縱對(duì)象 。 Java 語言首先便假定了我們只希望進(jìn)行 面向?qū)ο蟮某绦蛟O(shè)計(jì)。 無論 C++還是 Java 都屬于雜合語言。但在 Java 中,設(shè)計(jì)者覺得這種雜合并不 像 在C++里那么重要。也就是說,正式用它設(shè)計(jì)之前,必須先將自己的思想轉(zhuǎn)入一個(gè)面向?qū)ο蟮氖澜纾ǔ窃缫蚜?xí)慣了這個(gè)世界的思維方式)。 每種編程語言都有自己的數(shù)據(jù)處理方式。但要注意,盡管將一切都“看作 ”對(duì)象,但操縱的標(biāo)識(shí)符實(shí)際是指向一個(gè)對(duì)象的 “句柄 ”( Handle)。但一旦需要 “換頻道 ”或者 “關(guān)小聲音 ”,我們實(shí)際操縱的是遙控板(句柄),再由遙控板自己操縱電視機(jī)(對(duì)象)。所以如果想容納一個(gè)詞或句子,可創(chuàng)建一個(gè) String句柄: String s。因此,一種更安全的做法是:創(chuàng)建一個(gè)句柄時(shí),記住無論如何都進(jìn)行初始化: String s = asdf。 創(chuàng)建句柄時(shí),我們希望它同一個(gè)新對(duì)象連接。 它不僅指出 “將我變成一個(gè)新字串 ”,也通過提供一個(gè)初始字串,指出了 “如何生成這個(gè)新字串 ”。事實(shí)上,這應(yīng)是 Java 程序設(shè)計(jì)的一項(xiàng)基本操作,是繼續(xù)本書后余部分學(xué)習(xí)的基礎(chǔ)。這是最快的保存區(qū)域,因?yàn)樗挥诤推渌斜4娣绞讲煌牡胤剑禾幚砥鲀?nèi)部。駐留于常規(guī) RAM(隨機(jī)訪問存儲(chǔ)器)區(qū)域,但可通過它的 “堆棧指針 ”獲得處理的直接支持。這是由于它必須生成相應(yīng)的代碼,以便向上和向下移動(dòng)指針。和堆棧不同, “內(nèi)存堆 ”或 “堆 ”( Heap)最吸引人的地方在于編譯器不 必知道要從堆里分配多少存儲(chǔ)空間,也不必知道存儲(chǔ)的數(shù)據(jù)要在堆里停留多長的時(shí)間。當(dāng)然,為達(dá)到這種靈活性,必然會(huì)付出一定的代價(jià):在堆里分配存儲(chǔ)空間時(shí)會(huì)花掉更長的時(shí)間! 靜態(tài)存儲(chǔ)。但 Java 對(duì)象本身永遠(yuǎn)都不會(huì)置 入靜態(tài)存儲(chǔ)空間。有的常數(shù)需要嚴(yán)格地保護(hù),所以可考慮將它們置入只讀存儲(chǔ)器( ROM)。對(duì)于流式對(duì)象,對(duì)象會(huì)變成字節(jié)流,通常會(huì)發(fā)給另一臺(tái)機(jī)器。一旦需要,甚至能將它們恢復(fù)成普通的、基于 RAM 的對(duì)象。盡管它們大致可以劃分為 “封裝器 ”類型,但兩者都沒有對(duì)應(yīng)的 “主類型 ”。此外,由于牽涉更多,所以運(yùn)算速度會(huì)慢一些。 Big Decimal 支持任意精度的