Thinking in Java 第二章學習筆記
Java雖基於C++,但相比之下,Java是一種更加純粹的面向對象程序設計語言。
在Java的世界裏,幾乎一切都是對象,而Java中的全部工作則是定義類,產生那些類的對象,以及發送消息給這些對象。
盡管一切皆稱對象,但我們真正操縱的確是對象的引用,好比電視機為對象,遙控器則為引用,你若想在房間裏邊走邊操控電視,只需帶著遙控器這個引用,不必帶著電視這個對象。另外,引用可以單獨存在,並不需要有對象與之相關聯。如創建String s,則創建了一個String引用,但此時如果向這個引用發送消息,就會返回錯誤,這是因為s並沒有和任何對象相關聯。因此,比較安全的做法是創建一個引用的同時便進行初始化。當在創建引用時,其實我們是迫切希望它能與一個新的對象相關聯的,即對象的實例化。
本章重點:
1、程序運行時,具體內存分配情況分以下五種
1)寄存器:最快的存儲區,位於處理器內部,數量有限,只能根據需求自動分配,不能加以控制,程序中看不到其任何跡象。(C、C++可以向編譯器提供寄存器的分配方式)
2)棧:位於通用RAM(隨機訪問存儲器),通過棧指針的上下移動實現內存的釋放與分配。Java系統必須知道所有存儲在棧中數據的生命周期,以便指針的上下移動。十分限制程序的靈活性。對象引用存在堆棧,而對象存在於堆中。
3)堆:也位於RAM,一種通用的內存池。用於存放所有的Java對象,堆不同於堆棧的好處在於堆不需要知道存儲的數據的生命周期,大大提高了靈活性。代價:清除與存儲分配需消耗更多的時間。
4)常量存儲:常量值通常保存在程序的內部,但是再嵌入式系統中,常量本身回合其他部分分隔開,故選擇保存在只讀存儲器中。
5)非RAM存儲:如果數據完全存在於程序之外,那將不會受程序的任何控制,在程序沒有運行時也可以存在。兩個例子:流對象中將對象轉化為字節流,發送到另一臺機器;持久化對象中將對象存放於磁盤上。
2、基本類型所占存儲空間的大小
各基本類型固定大小。不像大多數語言那樣隨著機器硬件架構的變化而變化,這種固定性是Java移植性好的重要原因。
3、永遠不要銷毀對象
Java中的垃圾回收器,時刻監視用new創建的所有對象,並辨別那些不會再被引用的對象,隨後釋放這些對象的空間,供新對象使用。
4、變量初始化
當變量作為類的數據成員時,Java會給定其默認值,確保其初始化,以防程序錯誤。而對於非類中成員的其他變量來說,並不會自動初始化,必須對其賦值。
5、static
通常來說,當創建類時,局勢在描述那個類的對象的外觀和行為。除非用new創建那個類的對象,否則實際上並未獲得任何對象。只有在執行new來創建對象時,數據存儲空間才被分配,其方法才供外界調用。還有兩種情形是以上方法解決不了的,一種是只想為特定域分配單一存儲空間,而不去考慮究竟要創建多少對象,甚至根本就不用去創建任何對象。另一種情形是,希望某個方法不與包含它的類的任何對象產生關聯。通過static關鍵字可解決這兩種需要。當聲明一個事物是static時,就意味著這個域或者方法不會被包含它的類的所有對象關聯在一起。也就是說,即便沒有創建這個類的任何對象,也可以調用這個static方法或者static域。
6、Java中堆和棧的區別
堆:主要用於存放對象,存取速度慢,可以運行時動態分配內存,生存周期不需要提前確定。
棧:主要用於存放基本數據類型的變量以及對象的引用變量,變量出了作用域就會自動釋放。棧的內存管理是通過棧的"後進先出"模式來實現的。存取速度快,大小和生存周期必須確定,缺乏靈活性。
Thinking in Java 第二章學習筆記