java程式設計思想學習筆記——第2章 一切都是物件
儘管java是基於C的,但是相比之下,java是一種更“純粹”的面向物件程式設計語言。
2.1 用引用操縱物件
一切都視為物件,因此可採用單一固定的語法。儘管這一切都看作物件,但操縱的識別符號實際上是物件的一個“引用(reference)”。
java語言的一個特性:字串可以用帶引號的文字初始化。通常,必須對物件採用一種更通用的初始化方法。
2.2 必須由你建立所有物件
一旦建立了一個“引用”,就希望它能與一個新的物件相關聯。通常用new操作符來實現這一目的。
2.2.1 儲存到了什麼地方
(1)暫存器
這是最快的儲存區,因為它位於不同於其他儲存區的地方——處理器內部。但暫存器數量有限,所以暫存器根據需求進行分配。不能直接控制,也不能在程式中感覺到暫存器存在的任何痕跡。
(2)堆疊
位於通用RAM(隨機訪問儲存器)中,但通過堆疊指標可以從處理器那裡獲得直接支援。堆疊指標若向下移動,則分配新的記憶體;若向上移動,則釋放記憶體。僅次於暫存器。
(3)堆
一種通用的記憶體池,也位於RAM區,用於存放所有的java物件。堆相當於堆疊的好處是:編譯器不需要知道儲存的資料在堆裡存活多長時間。因此在堆裡分配儲存有很大的靈活性。但用堆進行儲存分配和清理可能比用堆疊進行儲存分配需要更多的時間。
(4)常量儲存
常量值通常存放在程式程式碼內部,這樣做是安全的,因為它永遠不會被改變。有時,在嵌入式系統中,常量本身會和其他部分隔離開,所以在這種情況下,可以選擇將其存放在ROM(只讀儲存器)中。
(5)非RAM儲存
如果資料完全存活於程式之外,那麼它可以不受程式的任何控制,在程式沒有執行時也可以存在。
流物件:物件被轉化成位元組流,通常被髮送給另一臺機器。
持久化物件:物件被存放於磁碟上,因此,即使程式終止,它們仍可以保持自己的狀態。
2.2.2 特例:基本型別
“基本型別”之所以特殊,是因為不是用new來建立變數,而是建立一個並非是引用的“自動變數”。這個變數直接儲存“值”,並置於堆疊中,因此更加高效。
boolean (true false) 包裝器型別 Boolean
char(16-bit) Character
byte(8-bits) Byte
short(16-bits) Short
int(32-bits) Intrger
long(64-bits) Long
float(32-bits) Float
double(64-bits) Double
void void
高精度數字:BigInteger 和 BigDecimal(二者都沒有相應的基本型別)。能作用於int和float的操作,也同樣能作用於BigInteger 和 BigDecimal 。只不過必須以方法呼叫方式取代運算子方式來實現。
2.2.3 java中的陣列
當建立一個數組物件時,實際上就是建立了一個引用陣列,並且每個引用都會自動被初始化為一個特定值,該值擁有自己的關鍵字null。一旦java看到null,就知道這個引用還沒有隻想某個物件。在使用任何引用前,必須為其指定一個物件;如果試圖使用一個還是null的引用,在執行時將會保錯。
存放基本資料型別的陣列,同樣,編譯器也能確保這種陣列的初始化,因為它將這種陣列所佔的記憶體全部置零。
2.3永遠不需要銷燬物件
2.3.1 作用域
作用域決定了在其內定義的變數名的可見性和生命週期。在C、C++和java中,作用域由花括號的位置決定。
2.3.2 物件的作用域
java物件不具備和基本型別一樣的生命週期。當new一個物件的時候,它可以存活於作用域之外。new一個物件,引用在作用域終點就會消失,但是指向的物件仍繼續佔據記憶體空間。
java的垃圾回收器用來監視new建立的所有物件,並辨別哪些不會在被引用。隨後釋放這些物件的記憶體空間,以便其它新的物件使用。
記憶體洩漏:程式設計師忘記釋放記憶體而產生的問題。
2.4 建立新的資料型別:類
2.4.1 欄位和方法
一旦定義了類,就可以在類中設定兩種型別的元素:欄位(有時被稱為資料成員)和方法(有時被稱為成員函式)。如果欄位是某個物件的引用,那麼必須初始化該引用,以便使其與一個實際的物件(使用new來實現)相關聯。
DataOnly類出了儲存資料外沒有別的用處,因為它沒有任何成員方法。
基本成員變數預設值:若類的成員是某個基本資料型別,即使沒有進行初始化,java也會確保它獲得一個預設值。當變數作為類的成員使用時,java才會確保給定其預設值。但是初始值對程式可能是不正確的,甚至是不合法的。所以最好明確地對變數進行初始化。
2.5 方法 、引數和返回值
java的方法決定了一個物件能夠接受什麼樣的訊息。方法的基本組成備份包括:名稱、引數、返回值和方法體。
方法只有通過物件才能被呼叫,且這個物件必須能執行這個方法呼叫。
2.5.1 引數列表
方法的引數列表指定要傳遞給方法什麼樣的資訊。這些資訊採用的都是物件形式。因此,在引數列表中必須指定每個所傳遞物件的型別及名字。這裡的傳遞實際上也是引用,並且引用的型別必須正確。
2.6 構建一個java程式
2.6.1 名字可見性
java通過反轉域名來避免命名發生衝突。
2.6.2 運用其它構件
import指示編譯器匯入一個包,也就是一個類庫。
2.6.3 static關鍵字
生命一個事物是stataic時,就意味著這個域或方法不會與包含它的那個類的任何物件例項關聯在一起。
2.7 你的第一個程式
2.7.1 編譯和執行
2.8 註釋和嵌入式文件
// /** */ /* */
2.8.1 註釋文件
javadoc用於提取註釋的工具,它是jdk安裝的一部分。
javadoc輸出的是一個HTML檔案,可以用web瀏覽器檢視。
2.8.2 語法
所有的javadoc命令都只能在“/** ”註釋中出現。 使用javadoc的方式主要由兩種:嵌入HTML, 或使用“文件標籤”。獨立文件標籤是使用“@”字元的,且要置於註釋行的最前面。“行內文件標籤”則可以出現在javadoc註釋中的任何地方,也是以“@”字元開頭,但要在花括號內。
共有三種類型的註釋文件,分別對應於註釋位置後面的三種元素:類、域和方法。
注:javadoc只能為public和projected成員進行文件註釋。private和包內可訪問成員的註釋可能被忽略掉。
2.8.3 嵌入式HTML
javadoc通過生成的HTML文件傳送HTML命令,這使你能充分利用HTML。主要目的還是對程式碼進行格式化。
所有型別的註釋文件——類、域和方法——都支援嵌入式HTML
2.8.4 一些標籤例項
(1) @see : 引用其他類
@see classname
@see fully-qualified-classname
@see fully-qualified-classname#method-name
上述每種格式都會在生成文件中加入一個具有超連結的“see also”條目。
(2){@link package.class#member label}
該標籤與@see標籤類似,只是它用於行內,並且是用“label”作為超連結文字而不用“see also”
(3){@docRoot}
該標籤產生到文件根目錄的相對路徑,用於文件樹頁面的顯示超連結。
(4){@inheritDoc}
該標籤從當前這個類的最直接的基類中繼承相關文件到當前的文件註釋中。
(5)@version
該標籤的格式如下:@version version-information
其中,“version-information”可以是任何你認為適合包含在版本說明中的重要資訊。
(6)@author
@author author-informatioin 姓名
(7)@since
該標籤允許你指定程式訂最早使用的版本,可以在HTML java文件中看到它被用來指定所用的jdk的版本
(8)@param
@param parameter-name description
方法的引數名 可延續數行的文字
(9)@return
@return descript
返回值
(10) @throws
@throws fully-qualified-class-name descript
第二個引數表示給出一個異常類無歧義的名字,第三個引數告訴你為什麼此特殊型別的異常會在方法呼叫中出現
(11)@deprecated
該標籤用於指出一些就特性已由改進的新特性取代,建議使用者不要使用這些就特性,因為在不久的將來它們可能會被刪除。
2.8.5 文件示例
2.9 編碼風格
在“Java程式語言編碼約定”中是這樣規定的:類名的首字母要大寫;如果類名由幾個單詞構成,那麼把它們並在一起,其餘每個內部單詞的首字母都要大寫形式。