1. 程式人生 > >thinking in java (一) ----- 萬物皆物件

thinking in java (一) ----- 萬物皆物件

reference是控制物件的鑰匙

在java中,一切的事物都被稱為物件,我們用於操控物件的標誌符號,實際上只是“reference”(引用)。reference和物件之間的關係,就好比是遙控器和電視的關係一樣。對電視進行換臺調節音量等,實際上是對遙控器進行的操作。

 

資料儲存在哪兒

1,暫存器(Registers)

這是速度最快的儲存場所,程式設計師不僅無法直接觸碰暫存器,也沒辦法在程式裡面感受到暫存器的存在。

2,棧(Stack)

位於一般的RAM中,處理器經由stack pointer提供直接支援。當程式分配一塊新的內容的時候,stack指標便往後移。釋放記憶體的時候,指標就往前移回。由於JAVA編譯器有責任產生這種“將stack指標前後移動”的程式碼,所以它必須掌握程式中“存在stack指標中所有資料的大小和存活時間

”。由於這個限制,儘管我們可以將reference存放在stack中,但是卻不能將一般的物件存放在stack中。

3,堆(Heap)

Heap是一種通用性質的記憶體儲存空間(也存在與RAM中),用來置放所有的java物件,Heap勝過Stack之處是,編譯器不需要知道從Heap分配的空間需要多大,也不需要知道空間存活時間,因此,heap分配記憶體有高度的彈性。當需要產生物件的時候,只需在程式中new,那麼執行的時候,便會自動heap分配空間。

4,靜態儲存空間(Static storage)

靜態指的是“在固定位置上”(也是在RAM中),中間存放著“程式執行期間”一直存在的資料。可以用static關鍵字,將物件內的某個特定成員設為靜態,但是java物件本身是不可能在靜態區中,

5,常量儲存空間(Constant storage)

常量值不會變,所以是安全的。也可以放到只讀記憶體ROM中。

6,Non-RAM儲存空間

沒有見過,暫且不表

 

基本型別

byte,short,int,long,float,double,boolean,char

如果使用new來產生基本型別這一簡單極小的便令,會因為將物件置於heap中而導致效率不佳,因此基礎型別不使用reference形式,而是產生一種所謂的“automatic”變數,此類變數直接放置在stack中,因此效率較高。

為了讓基礎型別也有面向物件的特性,加入了包裝類。生成的包裝類的物件一樣的存放在heap中,reference放在stack中。包裝類中有一系列屬性和方法,豐富了基本型別的操作。另外在ArrayList,HashMap中放置東西的時候,也只能放置物件。

Byte,Short,Integer,Long,Float,Double,Boolean,Character。

 

class:定義新的資料型別

class其實就是在描述物件的外觀長相行為舉措,除非new產生物件,否則並不存在實際的物件,產生物件以後,儲存空間才會分配出來,物件才可以被外界使用。

定義class的時候,其中有資料成員函式成員,當class中的基本型別沒有提供初始值的時候,java會賦予其一個預設值(像區域變數就不會給預設值)。

 

關鍵字static

當你某個資料成員或者函式成員被static修飾的時候,他就不侷限於所屬的class object中了,即使沒有產生object,外界還是可以使用class名呼叫static data。被static修飾的函式或者成員變數在類載入的時候就被執行,並且只執行一次,這時候建構函式沒有執行,物件沒有被產生,而non-static資料/函式都是和物件繫結的,因此被static修飾的函式不能呼叫non-static的資料/函式。既然沒有物件,也沒有this關鍵字

static修飾的資料成員被全域性共享,只有一個。