Presentation is loading. Please wait.

Presentation is loading. Please wait.

程式設計(二) 進階類別 郭文真 Sabrina Kuo.

Similar presentations


Presentation on theme: "程式設計(二) 進階類別 郭文真 Sabrina Kuo."— Presentation transcript:

1 程式設計(二) 進階類別 郭文真 Sabrina Kuo

2 outline 封裝 建構子 靜態區塊 內部類別

3 封裝 封裝的特點 隱藏類別實作的細節 強迫使用者透過方法操作屬性,如此可以保護資料不會被濫用 使程式碼更容易被維護

4 沒有封裝的物件 完整封裝的物件

5 存取修飾子 public:全域範圍,任何類別皆可存取 private:只同一類別存取,不可在子類別存取
protected:同一類別,子類別或同一套件存取與不同套件的子類別 沒有使用修飾子:同一類別和套件中,不包含不同套件的子類別 存取修飾子 類別 成員變數 成員方法 建構子 public private 可(巢狀) protected abstract Final

6 封裝的使用 class CCircle // 定義類別CCircle { private double pi=3.14;
private double radius; public void setCCircle(double r) // setCCircle() 方法 radius=r; } public void show() System.out.println("radius="+radius+", area="+pi*radius*radius); public class app9_1 public static void main(String args[]) CCircle cir1=new Ccircle(); // 建立物件並呼叫CCircle()建構元 cir1.setCCircle(4.0); cir1.show(); 封裝的使用

7 建構元 定義 幫助新建立的物件設定初值 建立物件時,便自動執行建構元的內容 多用於對物件的資料成員做初始化設定

8 建構元的使用 class CCircle // 定義類別CCircle { private double pi=3.14;
private double radius; public CCircle(double r) // 定義建構元CCircle() radius=r; } public void show() System.out.println("radius="+radius+", area="+pi*radius*radius); public class app9_1 public static void main(String args[]) CCircle cir1=new Ccircle(4.0); // 建立物件並呼叫CCircle()建構元 cir1.show(); 建構元的使用 2 3 1

9 計算矩形 // app8_3, method的建立 class CRectangle { //類別 比較 int width;
int height; int area() // 定義函數成員area(), 用來計算面積 { return width*height; // 傳回矩形的面積 } int perimeter() // 定義函數成員perimeter(), 用來計算周長 { return 2*(width+height); // 傳回矩形的周長 } } public class app8_3{ //公用類別 public static void main(String args[]) { CRectangle rect1; rect1=new CRectangle(); // 建立新的物件 rect1.width=10; // 設定矩形rect1的寬 rect1.height=5; // 設定矩形rect1的高 System.out.println("area="+rect1.area()); System.out.println("perimeter="+rect1.perimeter()); }} 比較 計算矩形

10 建構子 使用new及建構子建立物件 預設建構子 物件名稱 = new 類別名稱();
沒有定義建構子的類別時,編譯器會自動設給一個沒有形式參數的建構子 預設的建構子是沒有內容的,不會對物件的屬性有任何影影響 定義類別時,若有定義任何建構子,則編譯器不會設給預設建構子 物件名稱 = new 類別名稱();

11 建構子的呼叫 建立物件時呼叫建構子 方法可以和建構子同名。有回傳型別者為方法;反之,無回傳型別者為建構子
類別名稱 物件名稱 = new 類別名稱(形式參數列);

12 注意 建構子的名稱一律同類別名稱 不宣告回傳資料型別 建構子的修飾字可以為public、protected、private或無修飾字。
建構子修飾字不使用static和abstract 修飾字 類別名稱(形式參數列) { //程式敘述 }

13 定義建構子 建構子也可以多載 class SomeClass { public SomeClass() //不使用參數建立物件 }
public SomeClass(int x, int y) //使用參數建立物件

14 建構元多載 System.out.println("constructor CCircle() called"); radius=1.0;
class CCircle // 定義類別CCircle { private String color; private double pi=3.14; private double radius; public CCircle() // 沒有引數的建構元 System.out.println("constructor CCircle() called"); radius=1.0; color="Green"; } public CCircle(String str, double r) // 有兩個引數的建構元 System.out.println("constructor CCircle(String,double) called"); color=str; radius=r; public void show() System.out.println("color="+color+", Radius="+radius); System.out.println("area="+pi*radius*radius); public class app9_2 { public static void main(String args[]) CCircle cir1=new CCircle(); // 呼叫沒有引數的建構元 cir1.show(); CCircle cir2=new CCircle("Blue",4.0); // 呼叫有引數的建構元 cir2.show(); } 建構元多載

15 使用this() 建構子多載時,建構子呼叫其它建構子的限制: 必須使用 this() 取代類別名稱() 只能在第一個敘述呼叫
不能造成建構子遞迴

16 從某一建構元呼叫另一建構元 class CCircle // 定義類別CCircle { private String color;
private double pi=3.14; private double radius; public CCircle() // 沒有引數的建構元 this("Green",1.0); // 此行會呼叫第13行的建構元 System.out.println("constructor CCircle() called"); } public CCircle(String str, double r) // 有引數的建構元 System.out.println("constructor CCircle(String,double) called"); color=str; radius=r; public void show() System.out.println("color="+color+", Radius="+radius); System.out.println("area="+pi*radius*radius); }  } public class app9_3 { public static void main(String args[]) CCircle cir1=new CCircle(); cir1.show(); }  } 從某一建構元呼叫另一建構元

17 類別變數的使用 class CCircle // 定義類別CCircle {
private static int num=0; // 宣告num為類別變數 private static double pi=3.14; // 宣告pi為類別變數 private double radius; public CCircle() // 沒有引數的CCircle()建構元 this(1.0); // 呼叫第12行的建構元,並傳入1.0 } public CCircle(double r) // 一個引數的建構元 radius=r; num++; // 建構元被呼叫時,num便加1 public void show() System.out.println("area="+pi*radius*radius); public static void count() // count(),用來顯示目前物件建立的個數 System.out.println(num+" object(s) created"); public class app9_7 { public static void main(String args[]) CCircle.count(); // 用CCircle類別呼叫count() method CCircle cir1=new CCircle(); // 呼叫第8行的建構元 CCircle cir2=new CCircle(2.0); // 呼叫第12行的建構元 CCircle cir3=new CCircle(4.3); // 呼叫第12行的建構元 cir3.count(); // 用cir3物件呼叫count() method } 類別變數的使用

18 類別函數的限制 無法存取實例變數與實例函數 不能使用this public static void count() {
System.out.println( num+”object(s) created”); System.out.println(“radius=”+radius); //不能存取 } 不能使用this System.out.println( this.num+”object(s) created”); System.out.println(“radius=”+radius);

19 靜態區塊 類別定義中,以static為首的區塊即為靜態區塊 靜態區塊的特點: 和其它靜態成員一樣皆為類別所有
區塊內的敘述可以和類別方法一樣,使用方法呼叫及運算 當類別被JVM載入後,會先執行靜態區塊內的敘述,而且只執行一次

20 內部類別 位於另一個類別之內的類別稱之為內部類別(inner classes),或稱為巢狀類別(nested classes) 靜態內部類別
使用static修飾字宣告的內部類別,稱為靜態內部類別(static inner classes) 靜態內部類別和類別內其它靜態成員一樣,都屬類別所有,所以類別方法可以直接使用靜態內部類別建立物件 若某個類別欲使用另一個類別的靜態內部類別時,必須以點運算子(dot operator)指明靜態內部類別所屬的類別,才可使用

21 內部類別 public class app9_15 { public static void main(String args[])
Caaa aa= new Caaa(); aa.set_num(5); } static class Caaa int num; void set_num(int n) num=n; System.out.println("num= "+ num); 內部類別

22 匿名內部類別 frm.addWindowListener ( new WindowAdapter() {
public void wondowClosing(windowEvent e) System.exit(0); } ); 匿名內部類別

23 匿名內部類別 public class app9_17 { public static void main(String args[]) (
new Caaa() // 建立匿名內部類別Caaa的物件 void set_num(int n) num=n; System.out.println("num= "+ num); } ).set_num(5); // 執行匿名內部類別裡所定義的method static class Caaa //內部類別Caaa int num; 匿名內部類別

24 練習 課本9-42


Download ppt "程式設計(二) 進階類別 郭文真 Sabrina Kuo."

Similar presentations


Ads by Google