java 宣告物件(轉)

ba發表於2007-08-15
java 宣告物件(轉)[@more@]正如剛才講過的,當你建立一個類時,你建立了一種新的資料型別。你可以使用這種型別來宣告該種型別的物件。然而,要獲得一個類的物件需要兩步。第一步,你必須宣告該類型別的一個變數,這個變數沒有定義一個物件。實際上,它只是一個能夠引用物件的簡單變數。第二步,該宣告要建立一個物件的實際的物理複製,並把對於該物件的引用賦給該變數。這是透過使用new 運算子實現的。new運算子為物件動態分配(即在執行時分配)記憶體空間,並返回對它的一個引用。這個引用或多或少的是new分配給物件的記憶體地址。然後這個引用被儲存在該變數中。這樣,在Java 中,所有的類物件都必須動態分配。讓我們詳細看一下該過程。

在前面的例子中,用下面的語句來宣告一個Box型別的物件:

Box mybox = new Box();
本例將上面講到的兩步組合到了一起,可以將該語句改寫為下面的形式,以便將每一步講的更清楚:

Box mybox; // declare reference to object
mybox = new Box(); // allocate a Box object

第一行宣告瞭mybox ,把它作為對於Box型別的物件的引用。當本句執行後,mybox 包含的值為null ,表示它沒有引用物件。這時任何引用mybox 的嘗試都將導致一個編譯錯誤。第二行建立了一個實際的物件,並把對於它的引用賦給mybox 。現在,你可以把mybox 作為Box的物件來使用。但實際上,mybox 僅僅儲存實際的Box 物件的記憶體地址。這兩行語句的效果如圖6-1 所示。

圖6-1 宣告Box 型別的物件
注意:那些熟悉C/C++ 語言的讀者,可能已經注意到了物件的引用看起來和指標類似。這種懷疑實質上是正確的。一個物件引用和記憶體指標類似。主要的差別(也就是Java安全的關鍵)是你不能像實際的指標那樣來操作它。這樣,對於物件引用,你就不能像指標那樣任意分配記憶體地址,或像整數一樣操作它。

6.2.1 深入研究new 運算子

剛才已經解釋過,new運算子動態地為一個物件分配地址。它的通用格式如下:

class-var = new classname( );

其中,class-var 是所建立類型別的變數。classname 是被例項化的類的名字。類的後面跟的圓括號指定了類的建構函式。建構函式定義當建立一個類的物件時將發生什麼。建構函式是所有類的重要組成部分,並有許多重要的屬性。大多數類在他們自己的內部顯式地定義建構函式。如果一個類沒有顯式的定義它自己的建構函式,那麼Java 將自動地提供一個預設的建構函式。對類Box 的定義就是這種情況。現在,我們將使用預設的建構函式。不久,你將看到如何定義自己的建構函式。

這時,你可能想知道為什麼對整數或字元這樣的簡單變數不使用new 運算子。答案是Java 的簡單型別不是作為物件實現的。出於效率的考慮,它們是作為“常規”變數實現的。你將看到,物件有許多特性和屬性,使Java 對物件的處理不同於簡單型別。由於對處理物件和處理簡單型別的開銷不同,Java 能更高效地實現簡單型別。後面,你將看見,對於那些需要完全物件型別的情況下,簡單型別的物件版本也是可用的。

理解new運算子是在執行期間為物件分配記憶體的是很重要的。這樣做的好處是你的程式在執行期間可以建立它所需要的記憶體。但是,記憶體是有限的,因此new有可能由於記憶體不足而無法給一個物件分配記憶體。如果出現這種情況,就會發生執行時異常(你將在第10 章學習如何處理這種異常以及其他異常情況)。對於本書中的示例程式,你不必擔心記憶體不足的情況,但是在實際的程式設計中你必須考慮這種可能性。

讓我們再次複習類和物件之間的區別。類建立一種新的資料型別,該種型別能被用來建立物件。也就是,類建立了一個邏輯的框架,該框架定義了它的成員之間的關係。當你宣告類的物件時,你正在創造該類的例項。因此,類是一個邏輯構造,物件有物理的真實性(也就是物件佔用記憶體空間)。弄清楚這個區別是很重要的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-958067/,如需轉載,請註明出處,否則將追究法律責任。

相關文章