• 沒有找到結果。

137

範例說明:

(1)第14行Obj物件呼叫show函式時,將物件陣列當作引 數傳入函式中。

(2)在show函式中,我們列印X[i]的內容,會列印出每 個物件的參考位址,您可以發現,雖然陣列元素

X[0]~X[5]會位於連續的記憶體位址,但實際的物件實 體並不一定會位於連續的記憶體位址。參考圖示如下:

7.9 物件陣列

回顧定義類別的語法,我們可以發現,在宣告成員 變數或成員函式時,可以指定其[修飾字]。

其中,對於成員變數而言,我們可以將修飾字指定為 static, final, transient, volatile等等,或其組合,

不過final與volatile不能合用。

對於成員函式而言,我們可以將修飾字指定為static, final, abstract, native, synchronized等等,或其組 合,但abstract則不能與其他修飾字合用。

這些修飾字對於成員變數或成員函式將產生不同的 效果。在本節中,我們要介紹的只有static修飾字

使用static修飾字定義的成員變數稱為類別變數(class variable)

使用static修飾字定義的成員函式稱為類別方法(class

method)。因此,我們可以將語法修改如下:

139

定義「類別變數」與「類別方法」語法

【說明】:

(1)由於static仍可以和其他的修飾字合用,故我們保留了[其他 修飾字]語法欄位。不過,如果使用在成員函式宣告,則static不 可與abstract合用。

(2)在類別方法內,不可以存取實體變數。

7.10 類別變數與類別方法

[封裝等級] [修飾字] class 類別名稱 [extends 父類別] [implements介面]

{

[封裝等級] static [其他修飾字] 資料型態 field名稱; //宣告類別變數 :

:

[封裝等級] static [其他修飾字] 回傳值型態 method名稱(參數串) //定義類別方法 {

method的內容 }

: : }

變數的種類

在第二章時,我們曾經提及Java的變數一共分為 四大類如下,在之前的章節中,我們已經學習過 區域變數與參數,而事實上,我們也使用過實體 變數與類別變數,本節要深入探討的是實體變數 與類別變數的區別。

(1)實體變數(Instance Variables):見7.10.1節。

(2)類別變數(Class Variables):見7.10.2節。

(3)區域變數(Local Variables):在函式內宣告的變數

,生命週期侷限於函式執行時,視野也侷限於函式內。

(4)參數(Parameters):函式定義第一行所宣告的變數

。用於呼叫函式時,接收呼叫者傳遞之資料。

7.10 類別變數與類別方法

141

我們在類別內宣告成員變數與成員函式時,如果 沒有加上static修飾字,則可以將這些成員變數 與成員函式稱為實體變數(Instance Variables) 與實體方法(Instance Methods)。

顧名思意,實體變數與實體方法代表一定要有實 體,這些變數與方法才可使用。

當我們宣告一個物件變數並透過new產生實體後(

或透過設定運算子指向某一個實體後),就可以 在外部程式透過「物件名稱.成員變數」或「物件 名稱.成員函式()」來存取呼叫public等級的成員 變數及成員函式。

7.10.1 實體變數與實體方法

「必須透過物件名稱才能夠完成存取呼叫」是實體 變數與實體方法的特色。

在前面的圖示中,我們了解到,當每一個物件實體使用 new產生時,在記憶體中,針對每一個物件實體,會配 置實體變數所需要的記憶體空間

而對於實體方法也會配置一個記憶體空間,記載著程式 段的函式名稱與引數,並且this也會自動變成參數之一

換句話說,如果沒有使用new產生物件實體的話,則在 記憶體中,並不存在實體變數與實體方法。

例如下列範例發生錯誤的原因,是因為X並沒有物件實 體,所以無法存取實體變數,也無法執行實體方法。如 果將CMyClass X;修改為CMyClass X=new CMyClass();

則語法就沒有錯誤。

7.10.1 實體變數與實體方法

143

雖然Java是一個 純物件導向語言

,但並非每一個 變數與方法都必 須藉由物件才能 執行。例如在表 3-8所介紹的 toString(),就 不需要透過物件 即可執行,因為 它屬於類別方法

public class test         //主類別 {

public static void main(String args[]) {

CMyClass X;

X.Var=3;      //錯誤,因為X的參考為

相關文件