《java編程思想系列之1》 一切都是對象

一、用引用操縱對象

java中(幾乎)一切都是對象。儘管一切都看做對象,但是操縱的標識符實際上是對象的一個“引用”(reference)。

可以將這一情形想象成爲用遙控器(引用)來操縱電視機(對象)。只要握住這個遙控器,就能保持與電視機的連接。當有人想改變頻或者減小音量的時候,實際操控的是遙控器(引用),再有遙控器來調控電視機(對象)。如果想在房間裏四處走動,同時仍能夠調控電視機,那麼只需要攜帶遙控器(引用)而不是電視機(對象)。

沒有電視機,遙控器也可以獨立存在。也就是說,你擁有一引用,並不一定需要一個對象與之關聯。

例子: String s
這裏所創建的只是一個引用,並不是對象。如果此時向s發送一個消息,就會返回一個運行時錯誤。因爲此時海明誒有任何事物與之關聯。一種安全的做法是:創建一個引用的同時便進行初始化。
String s = "asf"

一旦創建了一個引用,就希望它能夠與一個新的對象相關聯。通常用new操作符來實現這一目的。new關鍵字的意思是“給我一個對象”:
String s = new String("asf")

二、必須由你創建所有的對象


1、數據存儲


(1)寄存器:最快的存儲區,位於處理器內部。但是寄存器的數量及其有限,所以寄存器根據需求進行分配。你不能直接控制,也不能再程序中感覺到寄存器存在的任何跡象。(c和c++允許你向編譯器建議寄存器的分配方式
(2)堆棧:位於RAM(隨機訪問存儲器)中,通過堆棧指針可以從處理器獲得直接支持。java系統必須知道存儲在堆棧內所有項的確切生命週期,以便上下移動堆棧指針。這一約束限制了程序的靈活性,所以雖然某些java數據存放在堆棧中--特別是對象引用,但是java對象並不存儲在其中。
(3)堆:一種通用的內存池(也位於RAM),用於存儲java對象。堆不同於堆棧的好處是:編譯器不需要知道存儲的數據在堆裏存活多長時間。
(4)常量存儲區:存放在ROM(只讀存儲器)
(5)非RAM存儲:如果數據完全存活於程序之外,那麼它可以不受程序的任何控制,在程序沒有運行的時候也可以存在。其中兩個基本的例子是流對象和持久化對象。

2、特例:基本類型

在程序設計中進場用到一系列的類型,他們需要特殊對待。可以把它們想象成”基本“類型。之所以特殊對待,是因爲new將對象存儲在堆裏,故用new創建一個對象---特別是小的、簡單的變量,往往不是很有效。因此對於這些類型,java採取和c相同的方法。也就說,不用new來創建變量,而是創建一個並非是引用的”自動“變量。這個變量直接存儲”值“,並置於堆棧中,因此更加有效。

java中基本類型的存儲空間大小固定

基本類型具有包裝器類,使得可以在堆中創建一個非基本對象,用來表示對應的基本類型:
char c = "x"
Character ch = new Character(c);

3、java中的數組

(1)數組確保會被初始化
(2)不能再它的範圍之外被訪問

當創建一個數組對象時候,實際上就是創建了一個引用數組,並且每個引用都會自動的被初始化爲一個特定值,該值擁有自己得關鍵字null

三 、永遠不要銷燬對象

1、作用域

java中不能隱藏外層作用域的變量。

2、對象的作用域

引用s的作用域終點就消失了,然而,s指向的String對象仍然佔據內存空間。

事實證明,由new創建的對象,只要你需要,就會一種保留下去。

java中有一個垃圾回收器,用來監視用new創建的所有對象,並辨別哪些對象不會再被引用。隨後,釋放這些對象的內存空間,以便供其他新的對象使用。


四、創建新的數據類型:類

1、字段和方法

基本成員的默認值:
若類的某個成員是基本數據類型,即使沒有進行初始化,java也會確保它有一個默認值。
當變量作爲類的成員使用時,java才確保給定其默認值,以確保那些是基本類型的成員變量得到初始化(c++沒有此功能
然而上述確保初始化的方法並不適用於局部變量,即並非是某個類的字段。

發佈了26 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章