1. 程式人生 > >Java程式設計思想 第二章:一切都是物件

Java程式設計思想 第二章:一切都是物件

1. 用引用操作物件

在Java中一切都是物件,但操縱識別符號的是物件的一個“引用”。可以將這一情形想象是電視機與遙控器的關係。電視機是一個物件,遙控器是物件的引用,我們在房間裡拿著遙控器不管在哪裡都可以操控電視機物件。此外,脫離電視機物件,遙控器引用也是可以獨立存在的。因此有如下程式碼:

String s;

這裡只是建立了一個引用,並沒有建立物件,如果此時向s傳送訊息的話,會報出執行時異常的錯誤,因為我們並沒有給這個引用指定物件,前文我們說到訊息的傳遞都是基於物件的。所以我們在宣告引用的時候要進行初始化:

String s="abc";

2.必須由你建立所有物件

我們建立了一個操作物件的引用,通常希望它可以與一個物件進行關聯。Java中更通用的做法是使用new關鍵字建立一個物件。new關鍵字的意思是“給我一個新的物件”,因此上文的例子可以寫成:

String s = new String("abc");

表示給我一個String型別的物件,並且初始化值為“abc”

當我們建立好物件時,他們是怎麼樣進行記憶體分配的呢?程式在計算機中,有如下五個地方可以儲存資料:

  1. 暫存器:這是最快的儲存區,他與其他儲存區不同的地方在於他在處理器的內部。同時他的數量也是非常有限的,因此他也是根據需求進行分配,你基本不能自己控制他進行記憶體分配。
  2. 堆疊:位於通用RAM(隨機儲存器)中,通過堆疊指標可以從處理器得到支援,指標向下移動分配新記憶體,指標向上移動回收記憶體。這是一種快速有效的分配記憶體方式,僅次於暫存器。建立程式時,Java系統必須知道處於堆疊中的所有項的確切宣告週期,以便堆疊指標的移動。這一操作限制了程式的靈活性,雖然Java中某些資料儲存在堆疊中,比如物件的引用,但是Java物件並不存在堆疊中。
  3. 堆:一種同樣位於RAM中的記憶體池,用於存放所有的Java物件,堆不同於堆疊的好處在於編譯器不需要提前知道物件的確切宣告週期,因此靈活性很高。當需要一個物件的時候,只需要new一段程式碼,會自動的分配所需要的記憶體。當然這種分配的效率要比使用堆疊的低。
  4. 常量儲存:常量值通常存在程式程式碼內部,這樣做使得他們永遠不會被改變。在部分嵌入式系統中,常量本身會與其他部分分離,這種情況通常將常量儲存在ROM(只讀儲存器)中。
  5. 非RAM儲存:資料可以完全儲存在程式之外,那麼他可以完全不受程式的控制,即便程式沒有啟動也可以存在。比如檔案流物件和持久化物件。檔案流通常是被髮送給另一臺機器,持久化物件通常儲存在硬碟中。

在這裡插入圖片描述

所有的數值型別都有正負號,所以Java中不存在無符號型別。

基本型別具有包裝器類,使得可以在堆中建立一個非基本物件,用來表示對應的基本型別。例如:

char c = ‘x’;
Character ch = new Character(c);
也可以這樣用:
Character ch = new Character(‘x’);
Java SE5的自動包裝功能可以自動的將基本型別轉換為包裝器型別:
Character ch = ‘x’;
也可以反向轉換:
char c = ch;
  • Java裡面自動包裝的特性

3.永遠不需要銷燬物件

Java語言與其他語言都有作用域的概念,作用域決定了在其內部定義的變數名的可見性和生命週期。作用域為對應的花括號區間內部。Java物件與其他的基本型別不同,他可以存活於作用域之外。如:

String s = new String("x");

引用s在對應的作用域終點就消失了,然而,s指向的String物件仍然佔據記憶體空間,我們無法在作用域之外訪問這個物件,因為它的唯一的引用已經超出了作用域的範圍,後面會講述程式的執行過程中,如何傳遞和複製物件的引用。Java中,只要你需要,物件會一直存在,Java自帶了垃圾回收器,用來監視new建立的物件,並辨別那些不會再引用的物件,從而釋放記憶體供其他物件使用。所以在Java中不必擔心忘了釋放物件的記憶體。

4. 建立新的資料型別:類

Java中會為類當中(不是類中的不算哦)的基本型別成員提供一個預設值,以確保這個基本資料型別可以有效的進行初始化,防止程式出現錯誤,當然這個初始化的值可能不符合程式需求,需要自己明確的進行初始化。如果不是在類中的基本型別變數,那麼它初始化的值是隨機的。具體預設初始化的值如下:
在這裡插入圖片描述