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類別內的無名區段
無名區段