• 沒有找到結果。

show();        //錯誤,X並未參考到實體 }

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

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

public class test         //主類別 {

public static void main(String args[]) {

CMyClass X;

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

145

類別變數(Class Variables)與類別方法(Class Methods)合稱類別成員(Class Members)

在宣告類別成員時,必須將修飾字宣告為static

,如同前面的語法格式,而使用時,由於沒有物 件名稱,故外部程式必須指名類別名稱才能夠執 行,如下語法:

外部程式存取「類別變數」與執行「類別方法」語 法:

類別名稱.類別變數;

類別名稱.類別方法(引數串);

7.10.2類別變數與類別方法

【說明】

(1)在類別內部的程式,不需要指名類別名稱即可取用 這些類別變數或執行類別方法。

(2)即使透過static宣告為「類別變數」與「類別方法

」,當該類別生成物件時,仍可以當作物件的「變數」

與「方法」來存取,存取語法與實體變數或方法完全相 同,只不過,這些由該類別生成的物件,「必須共用類 別變數」,同時,呼叫類別方法也是由同一個記憶體內 容指出被呼叫端位於的程式段。

7.10.2類別變數與類別方法

147

當編譯器完成編譯動作並開始執行時

於載入類別的同時,如果發現類別中包含類別變數與 類別方法,就會立刻配置這些類別成員(不必等到物 件實體產生時)

而對於實體變數與實體方法,則必須等到執行new敘 述而配置物件實體時才會配置。

以下,我們透過一個範例來觀察類別變數與 類別方法的使用方式與記憶體配置。

【觀念範例7-16】:存取類別變數與呼叫類別方法。

範例7-16:ch7_16.java(隨書光碟 myJava\ch07\ch7_16.java)

7.10.2類別變數與類別方法

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

/* 檔名:ch7_16.java 功能:類別變數與類別方法 */

package myJava.ch07;

import java.lang.*;

public class ch7_16 //主類別 {

public int Var;

public static int sVar;

public void show(String str) {

System.out.println(str + "'s Var=" + Var);

System.out.println("ch7_16 class sVar=" + sVar);

}

public static void add() //類別方法 {

//Var++;

sVar++;

}

7.10.2類別變數與類別方法

錯誤,因為類別方法內不可以存 取實體變數

X's Var=3

ch7_16 class sVar=7 Y's Var=10

ch7_16 class sVar=7

執行結果

149

範例說明:

(1)這個範例只有一個類別ch7_16。ch7_16類別內包含 一個實體變數Var,一個實體方法show。

(2)ch7_16類別內包含一個類別變數sVar,兩個類別方 法main,add。在add中,不可以存取Var,因為它是類別 方法,不可以直接存取實體變數。

22 23 24 25 26 27 28 29 30 31 32 33 34

public static void main(String[] args) {

ch7_16 X = new ch7_16();

ch7_16 Y = new ch7_16();

X.Var=3;

Y.Var=10;

X.sVar=5; //使用物件存取類別變數 X.add(); //使用物件執行類別方法 Y.add(); //使用物件執行類別方法 X.show("X");

Y.show("Y");

} }

7.10.2類別變數與類別方法

(3)X,Y是ch7_16類別的兩個物件實體的參考。

(4)在第26~32行,我們透過X,Y(物件名稱)存取實體 變數及類別變數,呼叫實體方法及類別方法,語法都相 同。

(5)由執行結果中,可以發現,不論是由X物件或Y物件 呼叫show函式,印出的sVar都相同,因為sVar是「共用 的變數」。在第28行首先透過X將sVar設定為5,然後在 第29行將它加1。第30行則是透過Y,將sVar又加1。因 此最後印出的為7。

(6)本範例執行完畢時的記憶體圖示如下,其中,

main,add,sVar是所有該類別之生成物件所共用的,故 它只有一份拷貝,並且該份拷貝在類別被載入記憶體時

,就被配置了(並非等到new敘述執行時)。

7.10.2類別變數與類別方法

151

7.10.2類別變數與類別方法

圖7-10 實體變數(及方法)與類別變數(及方法)

【觀念範例7-17】:透過類別名稱存取類別變數 與呼叫類別方法。

範例7-17:ch7_17.java(隨書光碟 myJava\ch07\ch7_17.java)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

/* 檔名:ch7_17.java 功能:類別名稱存取類別成員 */

package myJava.ch07;

import java.lang.*;

public class ch7_17 //主類別 {

public static void main(String args[]) {

CMyClass.show("修改前"); //執行類別方法 CMyClass.Var=20; //存取類別變數 CMyClass.show("修改後"); //執行類別方法 CMyClass X = new CMyClass();

X.show("使用物件呼叫時");

} }

7.10.2類別變數與類別方法

修改前Var=10 修改後Var=20

使用物件呼叫時Var=20

執行結果

153

範例說明:

(1)這個範例有兩個類別。其中CMyClass只有一個類別變數與一個 類別方法。

(2)在ch7_17類別中的main函式如果要存取CMyClass的類別變數,

並不需要產生物件,只要註明類別名稱即可,如第11行。呼叫類

別方法,也不需要產生物件,只要註明類別名稱即可,如第10、

相關文件