本章學習目標
認識類別的基本架構
在類別裡使用資料成員與成員函數 學習 this 關鍵字的用法
在類別裡設計 method 的多載
學習如何使用類別裡的公有與私有成員
第 第 八 八 章 章
認 認 識 識 類 類 別 別
8.1 認識類別
每一個 Java 程式,至少會存在一個或一個以上的類別。
8.1.1 類別的基本概念
矩形具有寬(width)與高(height)兩個基本屬性,根據這兩個屬性,
便可求出它的面積(area)與周長(perimeter)
width
height
面積(area) = width*height 周長(perimeter) = 2(width+height)
資料成員
每一個矩形,均具有寬與高這兩個屬性,這兩個屬性也就是矩形類別的 資料(data)。
Java 把類別內的資料成員統稱為 field(範疇)。
成員函數
對於矩形類別而言,可以把計算面積與周長的函數納入矩形類別裡,變
成類別的「成員函數」(member function)。
資料成員、成員函數與封裝
「類別」就是把資料與相關功能「封裝」(encapsulate)在一起。
類別
資料成員 data members 成員函數 member functions
以矩形類別為例,資料成員與成員函數可以用下圖表示:
描述CRecatngle 類別 的各種屬性
描述CRectangle 類別 可以執行的工作
CRectangle
成員函數 area()-計算面積
perimeter()-計算周長 CRectangle 類別的定義 資料成員
width height
8.1.2 類別的定義格式 類別定義的語法如下:
class 類別名稱 {
資料型態 field 名稱;
...
傳回值的資料型態 method 名稱(引數 1,引數 2,...) {
程式敘述 ; return 運算式;
} ...
}
宣告field
定義method 的內容 格式8.1.1 類別的定義格式
method 的本體(body)
以稍早所介紹的矩形為例,可定義如下的矩形類別:
01 class CRrectangle // 定義矩形類別 CRectangle 02 {
03 int width; // 宣告資料成員 width 04 int height; // 宣告資料成員 height 05
06 int area() // 定義成員函數 area(), 用來計算面積 07 {
08 return width*height; // 傳回矩形的面積 09 }
10 int perimeter() // 定義成員函數 perimeter(), 用來計算周長 11 {
12 return 2*(width+height); // 傳回矩形的周長 13 }
14 }
如果要計算圓面積,則可以把圓面積的計算納入圓形類別的成員函數:
01 class CCircle // 定義 CCircle 類別 02 {
03 double radius; // 宣告資料成員 radius 04
05 double area() // 定義成員函數 area(), 用來傳回圓面積 06 {
07 return 3.14*radius*radius; // 傳回圓面積 08 }
09 }
8.1.3 建立新的物件
以矩形類別來說,從定義類別到建立新物件的過程,可以把它想像成:
「先打造一個矩形的模版(定義類別),再以此模版製造矩形(建立物件)」
由類別所建立的物件稱為 instance。
下圖是由矩形類別所建立出具有該類別特性的矩形物件 rect1:
CRectangle
成員函數 area() perimeter() 資料成員 width height
rect1 物件
成員函數 area() perimeter() 資料成員 width height
打造矩形模版
(定義類別)
以模版製造矩形物件
(建立物件)
由類別建立物件
宣告與建立物件
欲建立屬於某類別的物件,可藉由下面兩個步驟來達成:
(1) 以類別名稱宣告變數。
(2) 利用 new 建立新的物件,並指派給先前所建立的變數。
例如:
CRectangle rect1;
rect1=new CRectangle();
把它縮減成一行:
// 建立新物件,並讓 rect1 指向它
CRectangle rect1= new CRectangle();
指向物件的變數
建立新的物件,並讓 rect1 變數指向它的過程,可由下圖來表示:
Ox1000 rect1
Ox1000
CRectangle rect1 = new CRectangle();
配置儲存CRectangle物件 所需的記憶空間
把記憶體空間的參考位 址設給rect1 變數存放
參考位址 1 先建立指向物件
參考位址的變數
2
3
由CRectangle 類別 所建立的物件
存取物件的內容
存取到物件裡的特定資料成員,可以透過下面語法來達成:
物件名稱.資料成員名稱
物件 rect1 的寬和高可藉由下列的語法來存取:
rect1.width;
rect1.height;
格式8.1.2
存取物件裡特定的資料成員
想要把物件 rect1 的寬設定為 10,把高設定為 5,其程式碼的撰寫如下:
01 public static void main(String args[]) 02 {
03 CRectangle rect1; // 宣告變數 rect1
04 rect1=new CRectangle(); // 建立新物件,並將變數 rect1 指派給它 05
06 rect1.width=10; // 設定矩形物件 rect1 的寬為 10 07 rect1.height=5; // 設定矩形物件 rect1 的高為 5 08 }
8.1.4 使用類別來設計完整的程式
下面的程式碼為建立物件與 field 的存取之範例。
01 // app8_1, 建立物件與 field 的存取
02 class CRectangle // 定義 CRectangle 類別 03 {
04 int width; // 宣告資料成員 width 05 int height; // 宣告資料成員 height 06 }
07
08 public class app8_1 09 {
10 public static void main(String args[]) 11 {
12 CRectangle rect1;
13 rect1=new CRectangle(); // 建立新的物件 14
15 rect1.width=10; // 設定矩形 rect1 的寬 16 rect1.height=5; // 設定矩形 rect1 的高 17
18 System.out.println("width="+rect1.width); // 印出 rect1.width 19 System.out.println("height="+rect1.height); // 印出 rect1.height 20 }
21 }
/* app8_1 OUTPUT--- width=10
height=5
---*/
當 app8_1 編譯成 byte-code 之後,會產生 CRectangle.class 與 app8_1.class 這兩個檔案:
Java 原始檔裡的每一個類別會 被編譯成獨立的.class 檔案
8.1.5 同時建立多個物件
如果要同時建立數個物件,只要依相同的方式再建立多個物件即可:
01 // app8_2, 同時建立兩個物件 02 class CRectangle
03 {
04 int width; // 定義資料成員 width 05 int height; // 定義資料成員 height 06 }
07
08 public class app8_2 09 {
10 public static void main(String args[]) 11 {
12 CRectangle rect1,rect2; // 宣告指變數 rect1,rect2 13 rect1=new CRectangle(); // 建立物件 rect1
14 rect2=new CRectangle(); // 建立物件 rect2 15
16 rect1.width=10; // 設定矩形 rect1 的寬 17 rect1.height=5; // 設定矩形 rect1 的高 18
19 rect2.width=12; // 設定矩形 rect2 的寬 20 rect2.height=rect1.height+3; // 設定矩形 rect2 的高
21
22 System.out.println("rect1.width="+rect1.width);
23 System.out.println("rect1.height="+rect1.height);
24 System.out.println("rect2.width="+rect2.width);
25 System.out.println("rect2.height="+rect2.height);
26 } 27 }
/* app8_2 OUTPUT-- rect1.width=10 rect1.height=5 rect2.width=12 rect2.height=8
---*/
8.2 成員函數的使用 8.2.1 定義與使用 method
類別裡的 method 可用下面的語法來定義:
傳回值型態 method 名稱(型態 引數 1, 型態 引數 2,...) {
程式敘述 ; return 運算式;
}
物件要呼叫封裝在類別裡的 method 時,只要用下列的語法即可:
物件名稱.method 名稱(引數 1, 引數 2,...)
格式8.2.1
成員函數定義的語法 method 的主體 (body)
格式8.2.2
呼叫封裝在類別內的 method
app8_3 在類別的定義裡加入了 area()與 perimeter() 兩個 method:
01 // app8_3, method 的建立 02 class CRectangle
03 {
04 int width;
05 int height;
06 int area() // 定義成員函數 area(), 用來計算面積 07 {
08 return width*height; // 傳回矩形的面積 09 }
10
11 int perimeter() // 定義成員函數 perimeter(), 用來計算周長 12 {
13 return 2*(width+height); // 傳回矩形的周長 14 }
15 } 16
17 public class app8_3 18 {
19 public static void main(String args[]) 20 {
21 CRectangle rect1;
22 rect1=new CRectangle(); // 建立新的物件
23
24 rect1.width=10; // 設定矩形 rect1 的寬 25 rect1.height=5; // 設定矩形 rect1 的高 26
27 System.out.println("area="+rect1.area());
28 System.out.println("perimeter="+rect1.perimeter());
29 } 30 }
/* app8_3 OUTPUT-- area=50
perimeter=30
---*/
8.2.2 再看一個簡單的範例
app8_4 建立一個圓形類別 CCircle,類別中包含了資料成員與成員函 數,用來顯示圓面積:
01 // app8_4, 圓形類別 CCircle
02 class CCircle // 定義類別 CCircle 03 {
04 double pi=3.14; // 將資料成員設定初值 05 double radius;
06
07 void show_area() // show_area() method, 顯示出圓面積 08 {
09 System.out.println("area="+pi*radius*radius);
10 } 11 }
12 public class app8_4 13 {
14 public static void main(String args[]) 15 {
16 CCircle cir1=new CCircle(); // 建立 cirl 物件 17 cir1.radius=2.0; // 設定 radius 的值 18 cir1.show_area(); // 呼叫 show_area()函數 19 }
20 }
/* app8_4 OUTPUT--- area=12.56
---*/
app8_5 說明了圓形類別 CCircle 之 field 於記憶體內的配置關係:
01 // app8_5, 圓形類別 CCircle 之 field 於記憶體內的配置關係 02 class CCircle // 定義類別 CCircle
03 {
04 double pi=3.14; // 將資料成員設定初值 05 double radius;
06
07 void show_area() // show_area() method, 顯示出圓面積 08 {
09 System.out.print("pi="+pi);
10 System.out.println(", area="+pi*radius*radius);
11 } 12 }
13 public class app8_5 14 {
15 public static void main(String args[]) 16 {
17 CCircle cir1=new CCircle(); // 建立 cir1 物件 18 CCircle cir2=new CCircle(); // 建立 cir2 物件 19
20 cir1.radius=cir2.radius=2.0; // 設定資料成員的值 21 cir2.pi=3.0; // 更改 cir2 的 pi 值 22
23 cir1.show_area();
24 cir2.show_area();
25 } 26 }
/* app8_5 OUTPUT---- pi=3.14, area=12.56 pi=3.0, area=12.0 ---*/
每一個新產生的物件,其資料成員在記憶體中均有其固定的存放處,如 下圖所示:
pi
3.14
記 憶 體 空 間 radius
cir1
pi radius
cir2
2.0
3.0 2.0
8.2.3 資料成員的存取方式
在 main() method 內如果需要存取 field 時,可透過 物件名稱 .資料成員名稱
的語法來進行。
下面的語法即可對 radius 與 pi 進行存取的動作:
01 class app 02 {
03 public static void main(String args[]) 04 {
05 ....
06 cir1.radius=2.0;
07 cir1.pi=3.0;
08 } 09 }
radius 與 pi 均為 cir1 的 field
如果是在類別的內部使用資料成員,則可直接取用資料成員的名稱:
01 class CCircle 02 {
03 double pi=3.14;
04 double radius;
05
06 void show_area() 07 {
08 System.out.println("area="+pi*radius*radius);
09 } 10 }
可直接取用field 的名稱
this 關鍵字
下面的程式碼片段是把 CCircle 類別的資料成員之前冠上 this 的寫法:
01 class CCircle 02 {
03 double pi=3.14;
04 double radius;
05
06 void show_area() 07 {
08 System.out.println("area="+this.pi*this.radius*this.radius);
09 } 10 }
在資料成員前面加上this,此時的 this 即代表取用此一資料成員的物件
8.2.4 成員函數的相互呼叫
app8_6 示範了如何呼叫在類別內部的成員函數:
01 // app8_6, 在類別內部呼叫 method
02 class CCircle // 定義類別 CCircle 03 {
04 double pi=3.14; // 將資料成員設定初值 05 double radius;
06
07 void show_area() // show_area() method, 顯示出圓面積 08 {
09 System.out.println("area="+pi*radius*radius);
10 }
11 void show_all() // show_all() method, 同時顯示出半徑與圓面積 12 {
13 System.out.println("radius="+radius);
14 show_area(); // 於類別內呼叫 show_area() method 15 }
16 }
17 public class app8_6 18 {
19 public static void main(String args[]) 20 {
21 CCircle cir1=new CCircle(); // 宣告並建立新的物件 22 cir1.radius=2.0;
23 cir1.show_all(); // 用 cir1 物件呼叫 show_all() 24 }
25 }
/* app8_6 OUTPUT-- radius=2.0
area=12.56
---*/
8.3 引數的傳遞與傳回值
method 不需傳遞任何引數時,method 的括號內什麼也不必填:
呼叫 method 並傳遞引數時,引數是置於 method 的括號內來進行傳遞。
show_area()
沒有傳遞任何引數,因此不需填上任何文字
8.3.1 呼叫 method 並傳遞引數
下面的範例中,把 CCircle 類別加上 setRadius() method,用來設定圓 形物件的半徑:
01 // app8_7, 呼叫 method 並傳遞引數 02 class CCircle // 定義類別 CCircle 03 {
04 double pi=3.14; // 將資料成員設定初值 05 double radius;
06
07 void show_area() // show_area() method, 顯示出半徑及圓面積 08 {
09 System.out.println("radius="+radius);
10 System.out.println("area="+pi*radius*radius);
11 }
12 void setRadius(double r) // setRadius() method, 可用來設定半徑 13 {
14 radius=r; // 設定 radius 成員的值為 r 15 }
16 }
17 public class app8_7 18 {
19 public static void main(String args[]) 20 {
21 CCircle cir1=new CCircle(); // 宣告並建立新的物件 22 cir1.setRadius(2.0); // 設定 cir1 的半徑為 2.0 23 cir1.show_area();
24 } 25 }
/* app8_7 OUTPUT-- radius=2.0
area=12.56
---*/
變數 r 是區域變數,一旦離開 setRadius(),變數 r 即會失去效用:
01 // app8_7,呼叫 method 並傳遞引數 02 class CCircle // 定義類別 CCircle 03 {
...
12 void setRadius(double r) 13 {
14 radius=r;
15 } 16 }
r 是區域變數,一離開此範圍,
變數r 即屬無效
8.3.2 傳遞多個引數
下面的範例是利用傳遞多個引數的方式,同時設定所有的資料成員:
01 // app8_8, 圓形類別 CCircle
02 class CCircle // 定義類別 CCircle 03 {
04 double pi; // 將資料成員設定初值 05 double radius;
06
07 void show_area() // show_area() method, 顯示出圓面積 08 {
09 System.out.println("area="+pi*radius*radius);
10 }
11 void setCircle(double p,double r) // 擁有兩個引數的 method 12 {
13 pi=p;
14 radius=r;
15 } 16 }
17 public class app8_8 18 {
19 public static void main(String args[]) 20 {
21 CCircle cir1=new CCircle(); // 宣告並建立新的物件
22 cir1.setCircle(3.1416,2.0); // 呼叫並傳遞引數到 setCircle() 23 cir1.show_area();
24 } 25 }
/* app8_8 OUTPUT-- area=12.5664
---*/
8.3.3 沒有傳回值的 method
若 method 本身沒有傳回值,則必須在 method 定義的前面加上關鍵字 void,如下面的程式碼:
void show_area(){ // show_area() method, 顯示出圓面積 {
System.out.println("area="+pi*radius*radius);
}
如果 method 沒有傳回值,則 return 敘述可以省略。
若 method 本身沒有傳回值,則 必須在前面加上void
也可以在 method 最後加上 return 敘述,但不接任何的運算式:
void show_area(){ // show_area() method, 顯示出圓面積 {
System.out.println("area="+pi*radius*radius);
return;
}
因沒有傳回值,所以可在method 結束前 加上return 敘述,但不接任何的運算式,
其執行結果與前例相同
8.3.4 有傳回值的 method
下面的範例中,特別在 CCircle 類別裡加上一個新的 getRadius() method ,用來傳回物件的半徑。
01 // app8_9, 圓形類別 CCircle
02 class CCircle // 定義類別 CCircle 03 {
04 double pi; // 將資料成員設定初值 05 double radius;
06
07 double getRadius() // getRadius(), 用來傳回物件的半徑 08 {
09 return radius;
10 }
11 void setCircle( double p, double r) 12 {
13 pi=p;
14 radius=r;
15 } 16 }
17 public class app8_9 18 {
19 public static void main(String args[]) 20 {
21 CCircle cir1=new CCircle(); // 宣告並建立新的物件 22 cir1.setCircle(3.1416,2.0);
23 System.out.println("radius="+cir1.getRadius());
24 } 25 }
/* app8_9 OUTPUT-- radius=2.0
---*/
getRadius() method 的本體很簡單,僅有一行敘述:
return radius;
經由上面的敘述,即可傳回物件的半徑 radius。
下圖是說明傳回值型態與傳回值的關係。
07 double getRadius() 08 {
09 return radius;
10 }
由於傳回值的資料型態為double,
因此getRadius() method 之前要冠 上double
8.4 成員函數的多載 8.4.1 多載
在 CCircle 類別裡加入了一個字串的資料成員 color,代表圓形之顏色。
01 // app8_10, 函數的多載(一)
02 class CCircle // 定義類別 CCircle 03 {
04 String color;
05 double pi=3.14;
06 double radius;
07
08 void setColor(String str) // 設定 color 的 method 09 {
10 color=str;
11 }
12 void setRadius(double r) // 設定 radius 的 method 13 {
14 radius=r;
15 }
16 void setAll(String str, double r) // 同時設定 color 與 radius 17 {
/* app8_10 OUTPUT--- color=Red, Radius=2.0 area=12.56
color=Blue, Radius=4.0 area=50.24
---*/
18 color=str;
19 radius=r;
20 }
21 void show() // 列印半徑、顏色與圓面積 22 {
23 System.out.println("color="+color+", Radius="+radius);
24 System.out.println("area="+pi*radius*radius);
25 } 26 }
27 public class app8_10 28 {
29 public static void main(String args[]) 30 {
31 CCircle cir1=new CCircle();
32
33 cir1.setColor("Red"); // 設定 cir1 的 color 34 cir1.setRadius(2.0); // 設定 cir1 的 radius 35 cir1.show();
36
37 cir1.setAll("Blue",4.0); // 同時設定 cir1 的 color 和 radius 38 cir1.show();
39 } 40 }
/* app8_10 OUTPUT--- color=Red, Radius=2.0 area=12.56
color=Blue, Radius=4.0 area=50.24
---*/
下 面 的 例 子 把 app8_10 的 method 用 多 載 的 特 性 , 以 單 獨 一 個 setCircle() method 的多載來取代。
01 // app8_11, 函數的多載(二)
02 class CCircle // 定義類別 CCircle 03 {
04 String color;
05 double pi=3.14;
06 double radius;
07
08 void setCircle(String str) // 設定color 成員 09 {
10 color=str;
11 }
12 void setCircle(double r) // 設定 radius 成員 13 {
14 radius=r;
15 }
16 void setCircle(String str, double r) // 同時設定 color 與 radius 17 {
18 color=str;
19 radius=r;
20 }
/* app8_11 OUTPUT--- color=Red, Radius=2.0 area=12.56
color=Blue, Radius=4.0 area=50.24
---*/
21 void show() 22 {
23 System.out.println("color="+color+", Radius="+radius);
24 System.out.println("area="+pi*radius*radius);
25 } 26 } 27
28 public class app8_11 29 {
30 public static void main(String args[]) 31 {
32 CCircle cir1=new CCircle();
33
34 cir1.setCircle("Red"); // 呼叫第 8 行的 setCircle() 35 cir1.setCircle(2.0); // 呼叫第 12 行的 setCircle() 36 cir1.show();
37
38 cir1.setCircle("Blue",4.0); // 呼叫第 16 行的 setCircle() 39 cir1.show();
40 } 41 }
/* app8_11 OUTPUT--- color=Red, Radius=2.0 area=12.56
color=Blue, Radius=4.0 area=50.24
---*/
使 用 多 載 時 , 編 譯 器 會 根 據 引 數 的 個 數 與 型 態 , 來 呼 叫 相 對 應 的 method:
cir1.setCircle("Red");
cir1.setCircle(2.0);
cir1.setCircle("Blue",4.0);
void setCircle(String str){
color=str;
}
void setCircle(double r){
radius=r;
}
void setCircle(String str, double r){
color=str;
radius=r;
}
8.4.2 使用多載常犯的錯誤
我們無法設計出引數個數或引數型態完全相同,而只有傳回型態不同的 多載。
下面的程式碼是行不通的:
void setCircle(double radius){ ... };
int setCircle(double radius){ ... };
一旦呼叫 setCircle() method,程式無法判斷是哪一個 method 被呼叫。
這兩個method 的引數個數和型態 完全相同,但傳回型態不同
下列多載的程式碼在 Java 裡是合法的:
void setCircle(String color,double radius);
int setCircle(double radius);
method 的引數個數和型態不 同,且傳回型態也不相同
8.5 公有成員與私有成員
下面的程式碼和 app8_4 幾乎完全相同,除了 18 行的設定,cir1 物件 的 radius 成員被設成-2.0:
01 // app8_12, 圓形類別 CCircle
02 class CCircle // 定義類別 CCircle 03 {
04 double pi=3.14; // 將資料成員設定初值 05 double radius;
06
07 void show_area() 08 {
09 System.out.println("area="+pi*radius*radius);
10 } 11 } 12
CCircle 類別 內部
13 public class app8_12 14 {
15 public static void main(String args[]) 16 {
17 CCircle cir1=new CCircle();
18 cir1.radius=-2.0;
19 cir1.show_area();
20 } 21 }
/* app8_12 OUTPUT--- area=12.56
---*/
CCircle 類別 外部 在CCircle 類別外部可以
直接更改成員資料
8.5.1 建立私有成員
透過私有成員(private member)的設定,即可限定類別中資料成員的 存取,設定的方式如下:
01 class CCircle 02 {
03 private double pi=3.14;
04 private double radius;
05 ....
06 }
設定field 為私有成員
app8_13 與 app8_12 除了在 field 之前加上 private 字樣之外,程式碼 完全相同。
01 // app8_13, 私有成員無法從類別外部來存取的範例 02 class CCircle // 設定 field 為私有成員 03 {
04 private double pi=3.14; // 將資料成員設定初值 05 private double radius;
06
07 void show_area() 08 {
09 System.out.println("area="+pi*radius*radius);
10 } 11 }
12 public class app8_13 13 {
14 public static void main(String args[]) 15 {
16 CCircle cir1=new CCircle();
17 cir1.radius=-2.0;
18 cir1.show_area();
19 } 20 }
在CCircle 類別內部,所以 可以存取私有成員
在CCircle 類別外部,無法 直接更改私有成員
編譯 app8_13,將會得到下列的錯誤訊息:
radius has private access in CCircle cir1.radius=-2.0;
^ 1 error
Process completed.
這個錯誤訊息說明了 radius 是私有成員,無法從 CCircle 類別以外的地 方來存取:
class CCircle {
private double pi=3.14;
private double radius;
...
} public static void main(String args[]) {
...
cir1.radius=-2.0;
...
} 無法存取到類別內
部的private 成員
8.5.2 建立公有成員
下面的範例是在 CCircle 類別內加上一個公有成員 setRadius(),也加入 了一個私有的成員函數 area():
01 // app8_14, 公有成員(method)的建立 02 class CCircle // 定義類別 CCircle 03 {
04 private double pi=3.14; // 將資料成員設定為 private 05 private double radius;
06
07 private double area() // 定義私有的成員函數 area() 08 {
09 return pi*radius*radius;
10 }
11 public void show_area() // 定義公有的成員函數 show_area() 12 {
13 System.out.println("area="+ area()); // 呼叫私有成員 area() 14 }
15 public void setRadius(double r) // 定義公有的成員函數 setRadius() 16 {
17 if(r>0) 18 {
19 radius=r; // 將私有成員 radius 設為 r 20 System.out.println("radius="+radius);
21 } 22 else
23 System.out.println("input error");
24 } 25 } 26
27 public class app8_14 28 {
29 public static void main(String args[]) 30 {
31 CCircle cir1=new CCircle();
32 cir1.setRadius(-2.0); // 呼叫公有的 setRadius() method 33 cir1.show_area(); // 呼叫公有的 show_area() method 34 }
35 }
/* app8_14 OUTPUT--- input error
area=0.0
---*/
類別內部的公有成員,可直接由類別外部來存取:
class CCircle // 定義類別CCircle {
....
public void setRadius(double r){
....
}
} class app8_14
{
public static void main(String args[]) {
CCircle cir1=new CCircle();
cir1.setRadius(-2.0);
cir1.show_area();
} } 可以存取到類別內
部的public 成員
8.5.3 資料的封裝
封裝(encapsulation),就是把 field 和 method 依功能劃分為「私有成員」
與「公有成員」,並且包裝在一個類別內來保護私有成員,使得它不會
直接受到外界的存取。
8.5.4 省略 public 與 private
public 與 private 是用來設定公有與私有成員的「修飾子」(modifier)。
類別內成員的修飾子與存取等級的關係,如下圖所示:
class 1 class 2 沒 有 修 飾 子 的 成員
public 成員 private 成員
package 1
class 3
package 2