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編程語言編碼約定”中是這樣規定的:類名的首字母要大寫;如果類名由幾個單詞構成,那麽把它們並在一起,其余每個內部單詞的首字母都要大寫形式。
java編程思想學習筆記——第2章 一切都是對象