寫在前面
首先我想說的是 Java程式設計思想——知識卡片 將是一系列文章,文章的內容是我閱讀《Java程式設計思想》這本書的心得體會,那麼我為什麼要寫這一系列的文章呢?原因有一下幾個方面:
- 重拾Java,因工作專案的特殊性,我已經一年多沒使用Java語言了。
- 想利用自己的業餘時間寫點東西幫助那些需要幫助的人。
- 將整本書的知識碎片化,充分利用自己零碎的時間。
一般情況下,最新文章會在我的微信公眾號:Java程式設計社群 更新,感興趣的話呢,可以加加關注。
好了,我們開始進入正題:
卡片01、用引用操作物件
學Java的人都知道,Java是一門物件導向的語言(OOP),儘管Java是基於C++的,但是相比之下,Java是一種更“純粹”的物件導向程式設計語言。正所謂“萬物皆物件”,Java語言假設我們只進行物件導向的程式設計,也就是說,我們開始使用Java進行設計之前必須轉換思想,將我們的注意力轉換到物件上來。這個是我們使用Java語言的基本功。
每種程式語言都有自己的資料處理方式。有些時候,程式設計師必須時刻留意準備處理的是什麼型別,是直接操縱元素,還是用某種基於特殊語法的間接表示來操縱物件?在C和C++裡我們使用的是指標。在Java裡這一切都得到了簡化,因為“萬物皆物件”,一切都被視為物件。儘管一切都看作物件,但操縱的識別符號實際上是物件的一個引用。這裡通過一個生活中的例子來幫助理解。生活中我們使用遙控器(引用)來操縱電視機(物件)。當要改變電視機的頻道或音量時,實際操縱的是遙控器(引用),再由遙控器來控制電視(物件)。如果想在房間裡四處走走,同時又能操縱電視機,那麼只需攜帶遙控器(引用)而不是電視機(物件)。
我們來建立一個String引用:
String str;
這裡的str只是一個引用,並非物件,引用是可以獨立存在的,並不一定需要一個物件與之關聯,就如即使沒有電視機,遙控器也可以獨立存在。但是上面這種建立並不安全,安全的做法是,我們建立引用的同時進行初始化。比如:
String str = "hello";
卡片02、程式執行時,記憶體是怎樣分配的呢?
程式在執行時,有五個不同的地方可以儲存資料:
- 1、暫存器:這是最快的儲存區,因為他位於不同於其他儲存區的地方--處理器內部。但是暫存器的數量及其有限,所以暫存器根據需求進行分配,你不能直接控制,也不能在程式中感覺到暫存器存在的任何跡象。
- 2、堆疊:位於通用RAM(隨機訪問儲存器)中,但通過堆疊指標可以從處理器那裡獲得直接支援。堆疊指標若向下移動,則分配新的記憶體;若向上移動,則釋放那些記憶體。這是一種快速有效的分配儲存的方法,僅次於暫存器。建立程式時,Java系統必須知道儲存在堆疊內所有項的確切宣告週期,以便上下移動堆疊指標。這一約束限制了程式的靈活性,所以雖然有些Java資料儲存在堆疊中--特別是物件引用,但是Java物件並不儲存於其中。
- 3、堆:一種通用的記憶體池(也位於RAM區),用於存放所有的Java物件。堆不同於堆疊的好處是:編譯器不需要知道儲存的資料在堆裡存活多長時間。因此,在堆裡分配有很大的靈活性。當需要一個物件時,只需用new寫一行簡單的程式碼,當執行這行程式碼時,會自動在堆裡進行儲存分配。當然,為這種靈活性必須要付出相應的代價:用堆進行儲存分配和清理可能比用堆疊進行儲存分配需要更多的時間
- 4、常量儲存:常量值通常直接存放在程式程式碼內部,這樣做是安全的,因為他們永遠不會被改變。有時在嵌入式系統中,常量會和其他部分隔離開,所以,在這種情況下,可以選擇將其存放在ROM(只讀儲存器)中。
- 5、非RAM儲存:如果資料完全存活於程式之外,那麼他可以不受程式的任何限制,在程式沒有執行時也可以存在。其中兩個基本的例子是:流物件和持久化物件,在“流物件”中,物件轉化成位元組流,通常被髮送給另一臺機器,在“持久化物件”中,物件被存放於磁碟上,因此即使程式終止,他們仍可以保持自己的狀態。這種儲存方式的技巧在於:把物件轉化成可以存放在其他媒介上的事物,在需要時,可以恢復成常規的、基於RAM的物件。Java提供了對輕量級持久化的支援,而諸如JDBC和hibernate這樣的機制提供了更加複雜的對在資料庫中儲存和讀取物件資訊的支援。
今天就到這了。。。
歡迎大家關注我的微信公眾號 Java程式設計社群 一起交流學習