寫在前面java
從事Java開發快三年了,從SE程序寫到EE程序,對Java語言的理解確定與三年前不一樣。隨着理解的加深,對Java也愈來愈敬畏。因此想忙裏偷閒複習一遍《Java編程思想》這本書,當年入門時拜讀,對一些東西只知其一;不知其二,跳過了一些暫時用不到的內容,重翻此書溫故並知新。c++
在這裏把閱讀過程當中一些值得我記住的東西和本身的思考記下來,便於之後翻看,也便於與各位探討。編程
2.1數組
做者在註解中寫到「我曾經讀到的一本書說:‘Java所支持的按址傳遞是徹底錯誤的’,由於Java對象標識符其實是對象的引用’,而且他接着說任何事物都是按值傳遞的。」oracle
這句話有些拗口,推測是翻譯的問題。我從前看過一個簡潔的說法與之契合(出處忘記了,對原做者表示抱歉):Java傳遞的是引用的值。即傳遞時是將對象的引用複製了一份,對象仍是那個對象,沒有多,只是多了一個指向它的引用。我比較贊同這種觀點。spa
2.2.net
本節與上一節給出了兩種初始化字符串的形式:翻譯
二者的比較讓我聯想到Java常量池:第一種引用指向了一個字符串常量,它在Java常量池中;而第二種引用指向了一個字符串對象。因此用 == 比較二者結果是false。code
相應的:orm
String s0 = "asdf"; String s1 = "asdf"; String s2 = "as" + "df";
s0 == s1結果爲true, s1 == s2 結果爲true。由於三個引用都指向了常量池中的同一個字符串常量。而
String s0 = "asdf"; String s1 = new String("asdf"); String s2 = "as" + new String("df");
s0 == s1結果爲false,s1 == s2結果爲false,s0 == s2結果爲false。由於s1和s2沒法再編譯期間肯定,因此它們是單獨的字符串對象。
本節中可總結出這樣的表述:Java的基本類型和引用存放在Java的堆棧中。
同時Java的對象都在Java堆內存中。
基本類型的相關總結:
Java提供了兩個用於高精度計算的類:BigInteger和BigDecimal。分別支持任意精度的整數的定點數。注意這裏BigDecimal是定點數,關於定點數和浮點數的區別:
定點數小數點固定的位於實數中間的某個位置。
浮點數 用科學計數法表達實數,由尾數、基數和指數以及正負號組成。Java平臺上的浮點數類型float和double採納了IEEE 754標準中所定義的單精度32位浮點數和雙精度64位浮點數的格式。第一個域佔1位是符號域,0表示整數、1表示負數。第二個域是指數域,單精度爲8位,雙精度爲11位。因爲指數既要表示正數又要表示負數,因此在無符號表示法上加入誤差,單精度爲12七、雙精度爲1023,以單精度爲例,8位能夠表達0到255之間的數,減去誤差127獲得指數的範圍是-127~128。第三個域爲尾數域,單精度23位、雙精度52位。IEEE標準要求尾數小數點左側必須爲1(由於是二進制),因此保存尾數時省略這個1。基數不用保存由於是2。
BigDecimal的實現:BigDecimal 由任意精度的整數非標度值 和 32 位的整數標度 (scale) 組成。若是爲零或正數,則標度是小數點後的位數。若是爲負數,則將該數的非標度值乘以 10 的負 scale 次冪。
這裏爲何說BigDecimal是定點數不得而知。
建立一個數組對象時,若是元素是引用則會被置爲null,若是是基礎類型,則會被自動初始化爲0。
2.3
在c++中有較大做用域的變量隱藏起來的作法,Java不容許這樣的作法。
2.4
若類的某個成員是基本數據類型,即便沒有進行初始化,Java會給它賦予一個默認值。大多說數據類型是0,boolean是false,而char是'\u0000', 在書中的表格裏'\u0000'的用括號標註爲null,在程序裏使用其實它是一個空格;
注意默認初始化只適用於類的變量而不適用於方法中的局部變量。若是在方法中定義基本類型不初始化直接使用編譯器會報錯。
2.5
字符串中的每一個字符的尺寸都是兩個字節,以此來提供對Unicode字符集的支持。
2.7
System.getProperties().list()
獲取全部環境變量屬性,並輸出到PrintStream或PrintWriter的對象中。
2.8
IBM的jikes編譯器也是一種經常使用的javac編譯器
2.8.2小節的第一段話有點彆扭,用本身的話總結一下:javadoc註釋中有兩種內容:第一,直接嵌入HTML中的內容;第二,文檔標籤,文檔標籤以@字符開頭,若是文檔標籤獨佔一行,則須要@在行開頭(不算表示註釋的*),若是不獨佔一行,則須要將文檔標籤用花括號括起來(包括@)。
javadoc只能爲public何protected成員進行文檔註釋,private和默認訪問的成員的註釋會被忽略。能夠在使用javadoc時添加-private參數將private成員的註釋也包括在內。
在javadoc註釋中可使用HTML標籤,以便控制生成的HTML格式,可是不要使用標題標籤例如<h1>或<hr>,由於這會和javadoc本身插入的標題衝突。
書中介紹的一些文檔標籤:
(1)@see 引用其餘類的文檔,格式:
@see classname
@see fully-qualified-classname
@see fully-qualified-classname#method-name
生成文檔時會加入一個具備超連接的See Also條目,可是javadoc不會檢查超連接是否有效;
(2){@link package.class#member label}
該標籤與@see類似,只用於行內,用label做爲超連接的文本而不是See Also
(3){@docRoot}
生成到文檔根目錄的相對路徑,用於文檔樹頁面的顯示超連接
(4){@inheritDoc}
從當前這個類的直接基類中繼承相關文檔到當前的文檔註釋中。
(5)@version version-information
version-information是任何包含在版本說明中的重要信息。若是javadoc命令使用了-version參數,則從生成的HTML文檔中特別提取出版本信息。
(6)@author author-information
包含做者信息,javadoc一樣有-author參數。可使用多個標籤以便列出全部做者,可是它們必須連續放置。所有做者信息會合併到同一段落。
(7)@since
指定程序代碼最先使用的版本
(8)@param parameter-name description
參數的描述
(9)@return
返回值的描述
(10)@throws
該方法拋出異常的說明
(11)@deprecated
表示一些舊特性已由改進的新特性取代,建議用戶不要再使用這些舊特性。
/Output標籤那段話不是很明白,應該是與以前提到的做者本身實現的doclets相關。有沒有筒子能解釋一下呢?謝謝。