《Java編程思想》第四版讀書筆記 第二章

寫在前面java

從事Java開發快三年了,從SE程序寫到EE程序,對Java語言的理解確定與三年前不一樣。隨着理解的加深,對Java也愈來愈敬畏。因此想忙裏偷閒複習一遍《Java編程思想》這本書,當年入門時拜讀,對一些東西只知其一;不知其二,跳過了一些暫時用不到的內容,重翻此書溫故並知新。c++

在這裏把閱讀過程當中一些值得我記住的東西和本身的思考記下來,便於之後翻看,也便於與各位探討。編程

2.1數組

做者在註解中寫到「我曾經讀到的一本書說:‘Java所支持的按址傳遞是徹底錯誤的’,由於Java對象標識符其實是對象的引用’,而且他接着說任何事物都是按值傳遞的。」oracle

這句話有些拗口,推測是翻譯的問題。我從前看過一個簡潔的說法與之契合(出處忘記了,對原做者表示抱歉):Java傳遞的是引用的值。即傳遞時是將對象的引用複製了一份,對象仍是那個對象,沒有多,只是多了一個指向它的引用。我比較贊同這種觀點。spa

2.2.net

本節與上一節給出了兩種初始化字符串的形式:翻譯

  1. String s = "asdf";
  2. String s = new String("asdf");

二者的比較讓我聯想到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堆內存中。

 

基本類型的相關總結:

  1. 基本類型的大小都是固定的,與os和硬件無關;
  2. 全部類型都是有符號的,Java中不存在無符號基本類型;
  3. char佔兩個字節(以前總忘記);
  4. boolean類型很特殊,做者說它所佔存儲空間的大小沒有明確指定。在《JVM虛擬機規範》一書中提到,字節碼中對boolean類型支持有限而且沒有該類型,在字節碼中將其轉換爲int,同時oracle的虛擬機實現將boolean數組轉換成byte數組。這裏就有個問題,反編譯時如何肯定是boolean類型呢?有待研究。

 

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相關。有沒有筒子能解釋一下呢?謝謝。

相關文章
相關標籤/搜索