thinking in java (一) ----- 萬物皆物件
reference是控制物件的鑰匙
在java中,一切的事物都被稱為物件,我們用於操控物件的標誌符號,實際上只是“reference”(引用)。reference和物件之間的關係,就好比是遙控器和電視的關係一樣。對電視進行換臺調節音量等,實際上是對遙控器進行的操作。
資料儲存在哪兒
1,暫存器(Registers)
這是速度最快的儲存場所,程式設計師不僅無法直接觸碰暫存器,也沒辦法在程式裡面感受到暫存器的存在。
2,棧(Stack)
位於一般的RAM中,處理器經由stack pointer提供直接支援。當程式分配一塊新的內容的時候,stack指標便往後移。釋放記憶體的時候,指標就往前移回。由於JAVA編譯器有責任產生這種“將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修飾的資料成員被全域性共享,只有一個。