雖然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