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的參考為
在文檔中
第七章第七章 物件導向設計: 物件導向設計: 類別與物件 類別與物件
(頁 69-72)