• 沒有找到結果。

153

範例說明:

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

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

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

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

155

建構子在物件實體產生時,自動被new敘 述呼叫,進行物件實體的初始化設定

可是類別成員在類別被載入時就會被配置記憶體

,如果想要將類別變數初始化,除了設定初值之 外,就必須透過static區段來設計初始化動作,

如下語法:

【語法說明】:

上面這個static區段,必須放在類別內,它不屬於任何 方法,並且會在類別變數配置之後自動開始執行。

static{

……敘述群(可進行類別變數初始化)……

}

7.10.4 類別成員的初始化

【觀念範例7-18】:改寫範例7-17,透過static區段初始 化類別變數。

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

7.10.4 類別成員的初始化

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

/* 檔名:ch7_18.java 功能:static區段 */

package myJava.ch07;

import java.lang.*;

public class ch7_18 //主類別 {

public static void main(String args[]) {

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

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

} }

157

執行結果:

18 19 20 21 22 23 24 25 26 27 28 29 30 31

class CMyClass {

public static int Var;

public static void show(String str) {

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

} static{

Var=100;

System.out.println("類別變數Var初始化完畢" + Var);

show("初始化之後");

} }

類別變數Var初始化完畢100 初始化之後Var=100

修改前Var=100 修改後Var=20

使用物件呼叫時Var=20

7.10.4 類別成員的初始化

範例說明:

從執行結果中,可以發現,static是最早被執行的程式 區塊(比main函式還要早),因為JVM會先載入ch7_18 與CMyClass類別後才執行主類別的main函式,而當載入 CMyClass類別後,就會自動執行static區段的敘述。

7.10.4 類別成員的初始化

159

在上一小節中,我們發現以static為名 的區段會在類別載入後自動開始執行。

事實上,Java允許我們在類別內定義一個無名的 區段,而該區段會在物件實體產生時,自動被執 行,並且執行時機比建構子還要早。

不過,由於利用建構子對物件進行初始化是比較 正統的做法,因此建議盡量少用這樣的語法。

【觀念範例7-19】:類別內無名區段的執行時機 範例7-19:ch7_19.java(隨書光碟

myJava\ch07\ch7_19.java)

7.10.5類別內的無名區段

7.10.5類別內的無名區段

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

/* 檔名:ch7_19.java 功能:類別內的無名區段 */

package myJava.ch07;

import java.lang.*;

public class ch7_19 //主類別 {

public static void main(String args[]) {

CMyClass X = new CMyClass();

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

} } class CMyClass {

public int Var;

public CMyClass() {

Var=10;

System.out.println("建構函式執行中");

show("建構函式執行完畢時");

}

161

執行結果:

無名區塊執行中

無名區塊執行完畢時Var=100 建構函式執行中

建構函式執行完畢時Var=10 使用物件呼叫時Var=10

24 25 26 27 28 29 30 31 32 33

public void show(String str) {

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

} {

Var=100;

System.out.println("無名區塊執行中");

show("無名區塊執行完畢時");

} }

7.10.5類別內的無名區段

無名區段

範例說明:

由執行結果中可以發現,無名區段會在建構函式開始前 就先被執行。而如果您將第10行的new敘述去除,例如 改寫為CMyClass X;(當然第11行必須刪除)則無名區 段也不會被執行,因為物件實體尚未產生。

7.10.5類別內的無名區段

相關文件