890 likes | 1.02k Views
Ch01 物件與類別複習. 物件導向系統實務. 本章大綱. 以實例介紹物件導向的概念 以文字問答敘述複習物件類別的概念. 第一部份. 以實例介紹物件導向的概念. 類別與物件 (1/3). 實際世界:有一家吸塵機器人的製造工廠,工廠生產會自動行走的吸塵器,工廠生產了 1000 台機器。我家買了一台,你家也買了一台 物件:每一台吸塵機器人都有自己的實體,實體內包含有自己的名字、顏色 … 等特性值,例如: 我家的吸塵機器人、你家的吸塵機器人、還有其他的 998 台吸塵機器人 類別:包含屬性(特性)、建構子、方法(動作)等的設定,例如: 生產線上的模子.
E N D
Ch01 物件與類別複習 物件導向系統實務
本章大綱 以實例介紹物件導向的概念 以文字問答敘述複習物件類別的概念
第一部份 以實例介紹物件導向的概念
類別與物件(1/3) 實際世界:有一家吸塵機器人的製造工廠,工廠生產會自動行走的吸塵器,工廠生產了1000台機器。我家買了一台,你家也買了一台 物件:每一台吸塵機器人都有自己的實體,實體內包含有自己的名字、顏色…等特性值,例如:我家的吸塵機器人、你家的吸塵機器人、還有其他的998台吸塵機器人 類別:包含屬性(特性)、建構子、方法(動作)等的設定,例如:生產線上的模子
類別與物件(2/3) 主程式: class ourWorld { public static void main(String [] args) { 吸塵機器人 robot1 = new 吸塵機器人(“toto”, “銀灰色”); 吸塵機器人 robot2 = new 吸塵機器人(“月餅”, “紅色”); } } 類別:吸塵機器人 class 吸塵機器人 { //屬性 String name; String color; //建構子 吸塵機器人(String name, String color) { this.name = name; this.color = color; } //方法 void 吸塵(){…} }
類別與物件(3/3) 吸塵機器人 name:String color:String instanceOf instanceOf 吸塵():void robot1:吸塵機器人 robot2:吸塵機器人 name:String = toto color:String=銀灰 name:String=月餅 color:String=紅 吸塵():void 吸塵():void
類別-如何建立一個類別(1/4) 類別的建立有兩個方法: 自己一行一行程式的去完成 善用已經存在的類別去組合完成
類別-如何建立一個類別(2/4) 實際世界:吸塵機器人的模子是這樣做的,吸塵機器人需要有三個技術結合: 吸塵器 感應器(偵測是否撞到墻?) 自動行走(類似玩具小汽車,會利用電力來前進) 工廠的設計部門當然不會自己設計這三個技術,他們會花錢購買這三個技術,再將這三個技術結合,再補加上一些設計,一個吸塵機器人的模子就完成了! 以物件導向的概念來看: 父類別:包含吸塵器、感應器、自動行走等類別 子類別:吸塵機器人 繼承:子類別繼承父類別,即子類別是新產物,而父類別是舊(已)有的技術 但是,JAVA是單一繼承,所以,在父類別中,吸塵器應該是吸塵機器人真正的父親;而感應器和自動行走,我們可以視為其輔助功能,我們以介面來實現 介面:類似類別,但是其方法沒有實作
類別-如何建立一個類別(3/4) 繼承關係: 吸塵器 <interface>感應器 <interface>自動行走 吸塵():void 感應():void 走():void 吸塵機器人 name:String color:String instanceOf instanceOf 吸塵():void 感應():void 走():void robot1:吸塵機器人 robot2:吸塵機器人 name:String = toto color:String=銀灰 name:String=月餅 color:String=紅 吸塵():void 吸塵():void
類別-如何建立一個類別(4/4) 類別:吸塵器 class 吸塵器 { void 吸塵() {…} } 介面:感應器 interface 感應器 { void 感應(); } 介面:自動行走 interface 自動行走 {void 走(); } 類別:吸塵機器人 class 吸塵機器人 extends 吸塵器 implements 感應器, 自動行走 { //屬性 String name; String color; //建構子 吸塵機器人(String name, String color) { this.name = name; this.color = color; } //方法 void 吸塵(){…} void 感應() {撞到東西原地打轉;} void 走() { 直直的走; } }
多載(1/3) 實際世界:吸塵機器人已雛型完成,因為是智慧型的機器人,它會自己判斷現在地上是灰塵,還是可樂,還是固體加上液體。 這在物件導向程式設計中就是 多載:在一個類別中,有多個同名的方法,方法的回傳及參數個數或型式不同,例如: void 吸塵(液體) void 吸塵(固體) void 吸塵(液體,固體)
多載(2/3) 類別:吸塵機器人 class 吸塵機器人 extends 吸塵器 implements 感應器, 自動行走 { //屬性 String name; String color; //建構子 吸塵機器人(String name, String color) { this.name = name; this.color = color; } //方法 void 吸塵(液體){…} void 吸塵(固體){xxx} void 吸塵(液體, 固體) {ccc} void 感應() {撞到東西原地打轉;} void 走() { 直直的走; } }
多載(3/3) 吸塵器 <interface>感應器 <interface>自動行走 吸塵():void 感應 ():void 走():void 吸塵機器人 name:String color:String instanceOf instanceOf 吸塵(液體):void 吸塵(固體):void 吸塵(液體, 固體):void 感應():void 走():void robot1:吸塵機器人 robot2:吸塵機器人 name:String = toto color:String=銀灰 name:String=月餅 color:String=紅 吸塵(液體):void 吸塵(固體):void 吸塵(液體, 固體):void 感應():void 走():void 吸塵(液體):void 吸塵(固體):void 吸塵(液體, 固體):void 感應():void 走():void
多型(1/3) 實際世界:工廠發現所設計的機器人打掃結果不理想,設計部門要做部份的修改,再生產吸塵機器人二世代。設計修改的部份是「走」,設計師發現原來的行動方向是類似「直線前進」,現在要做三種機器人: 機器人-A型:如乒乓球般撞到墻,會有一個回彈角度 機器人-B型:每次撞到墻,會產生一個亂數斜率,再以此斜率前進 機器人-C型:每次以旋轉方式前進
多型(2/3) 吸塵器 <interface>感應器 <interface>自動行走 吸塵():void 感應 ():void 走():void 吸塵機器人 name:String color:String instanceOf instanceOf 吸塵(液體):void 吸塵(固體):void 吸塵(液體, 固體):void 感應():void 走():void robot1:吸塵機器人 robot2:吸塵機器人 name:String = toto color:String=銀灰 name:String=月餅 color:String=紅 吸塵(液體):void 吸塵(固體):void 吸塵(液體, 固體):void 感應():void 走():void 吸塵(液體):void 吸塵(固體):void 吸塵(液體, 固體):void 感應():void 走():void 機器人二世代-A 機器人二世代-B 機器人二世代-C 走():void { 直直的走;} 走():void { 亂數斜率的走;} 走():void { 螺旋型的走;}
多型(3/3) 類別:二世代-A class 機器人二世代-A extends 吸塵機器人 { void 走() { 直直的走; } } 類別:二世代-B class 機器人二世代-B extends 吸塵機器人 { void 走() { 亂數斜率的走; } } 類別:二世代-C class 機器人二世代-C extends 吸塵機器人 { void 走() { 螺旋的走; } } 如果在main方法中告一個物件x1如下: 機器人二世代-B x1 = new 機器人二世代-B(); 問題:x1怎麼走? 如果在main方法中宣告一個物件x2 如下: 吸塵機器人 x2 = new 機器人二世代-C(); 問題: x2怎麼走?
第二部份 以文字問答敘述複習物件類別的概念
類別與物件 • 程式之主體類別,其名稱必須與其儲存檔案之主檔名相同 • 主程式起始位置之字串public static void main(String [] args) • 物件之屬性或成員以句點“.”描述之 2014/9/9 18
Q1: 類別與物件 • class myNumber { • int number; • } • class Ex2_1_1 { • public static void main(String[] args) { • myNumber a; • a= new myNumber(); • a.number= 5; • System.out.println("a.number= "+a.number); • } • } 2014/9/9 19
Q2: 原始型態與參考型態 • 原始型態為系統預設資料型態,如int、char、float、long、boolean等,可直接給予資料 • 參考資料為以設計之類別為資料型態,附以變數之型態,所以參考型態變數應先產生新物件,再給予資料 2014/9/9 20
Q2: 原始型態與參考型態 • class myNumber { • int i; • } • class Ex2_2_1 { • public static void main(String[] args) { • int j; • myNumber a; • j=3; • a = new myNumber(); • a.i=5; • System.out.println("j="+j); • System.out.println("a.i="+a.i); • } • } 2014/9/9 21
Q3: 生存物件之變數(屬性) • 當以某類別為資料型態之物件尚未建立時,其中所宣告之屬性,均無法存取。 • 如果要使用這些屬性,就必須先產生其所屬之物件 2014/9/9 22
Q3: 生存物件之變數(物件屬性) • class MyClass1 { • int i; • } • class Ex2_4_1 { • int j; • public static void main(String[] args) { • i = 3; • j = 5; • System.out.println("i="+i); • System.out.println("j="+j); • } • } 2014/9/9 23
Q3: 生存物件之變數(物件屬性) • class MyClass1 { • int i; • } • class Ex2_4_2 { • int j; • public static void main(String[] args) { • MyClass1 a = new MyClass1(); • Ex2_4_2 b = new Ex2_4_2(); • a.i=3; • b.j=5; • System.out.println("i="+a.i); • System.out.println("j="+b.j); • } • } 2014/9/9 24
Q4: 類別之變數(類別屬性) • 於類別中宣告之變數,若加上static,該變數即謂類別變數,否則是生存物件變數 • 類別變數可直接使用,不必先產生物件 • 類別變數是同一類別中所有物件所共有,而不是屬於某個物件 2014/9/9 25
Q4: 類別之變數 • class MyClass1 { • static int i; • } • class Ex2_5_1 { • static int j; • public static void main(String[] args) { • MyClass1.i = 3; • j = 5; • System.out.println("i="+MyClass1.i); • System.out.println("j="+j); • } • } 2014/9/9 26
Q4: 類別之變數 • class MyClass1 { • static int i; • } • class Ex2_5_2 { • static int j; • public static void main(String[] args) { • MyClass1 a = new MyClass1(); • Ex2_5_2 b = new Ex2_5_2(); • MyClass1 c = new MyClass1(); • a.i=3; • b.j=5; • System.out.println("i="+a.i); • System.out.println("j="+b.j); • System.out.println("c.i="+c.i); • System.out.println("MyClass1.i="+MyClass1.i); • System.out.println("Ex2_5_2.j="+j); • } • } 2014/9/9 27
Q5: 方法 • 類別中,所宣告之方法,類似一般高階語言的副程式 • 使用方法時,須先產生新物件再執行各新物件內之方法 • 使用( 呼叫)方法時,要注意傳入參數之一致性 • 參數型態一致 • 參數數量一致 • 宣告方法時,若無回傳資料,必須前置void,若有回傳資料,要註明回傳資料型態,且要有return 2014/9/9 28
Q5: 方法 • class Study { • private int credit=0; • void addcredit(int i) { credit += i; } • int totalcredit() { return credit; } • } • class Ex2_6_1 { • public static void main(String[] args) { • Study joe = new Study(); • Study george = new Study(); • joe.addcredit(12); • george.addcredit(9); • joe.addcredit(6); • george.addcredit(3); • System.out.println("joe studied:"+joe.totalcredit()+"credites"); • System.out.println("georgestudied:"+george.totalcredit()+"credites"); • } • } 2014/9/9 29
Q6: 物件方法 • 當方法所屬之物件尚未產生之前,該方法是無法執行的 2014/9/9 30
Q6: 物件方法 • class Mynumber { • public int number; • public void setnumber(int i) { number = i; } • public int getnumber() { return number; } • } • class Ex2_7_1{ • public static void main(String[] args) { • Mynumber.setnumber(3); • System.out.println("number= "+Mynumber.number); • } • } 2014/9/9 31
Q6: 物件方法 • class Mynumber { • public int number; • public void setnumber(int i) { number = i; } • public int getnumber() { return number; } • } • class Ex2_7_2{ • public static void main(String[] args) { • Mynumber a= new Mynumber(); • a.setnumber(3); • System.out.println("number= "+a.getnumber()); • } • } 2014/9/9 32
Q7: 類別方法 • 類別方法於宣告時須前置static • 類別方法不同於物件方法,類別方法可直接使用 • 類別方法不可以直接呼叫物件方法,因為物件方法要先有物件存在,呼叫時要加上物件.方法() • 物件方法可以直接呼叫類別方法 2014/9/9 33
Q7: 類別方法 • class Mynumber { • public static int number; • public static void setnumber(int i) { number = i; } • public static int getnumber() { return number; } • } • class Ex2_8_1{ • public static void main(String[] args) { • Mynumber.setnumber(3); • System.out.println("number= "+Mynumber.number); • } • } 2014/9/9 34
Q8: 建構子 • 建構子之名稱必須與所屬類別之名稱相同 • 在沒有定義建構子的類別時,編繹器會自動設給一個沒有形式參數的建構子 • 建構子無回傳資料,內容無return,宣告中亦不得前置void • 建構子主要功能是在所屬類別產生新物件時作初始化動作 2014/9/9 35
Q8: 建構子 • class Mynumber { • int number; • Mynumber() { • System.out.println("Here is Constructor"); • number = 3; • } • int getnumber() { return number; } • } • class Ex2_9_1 { • public static void main(String[] args) { • Mynumber a = new Mynumber(); • System.out.println("Here is main: "+a.getnumber()); • } • } 2014/9/9 36
Q9: 方法多載 • 方法多載之定義為:在同一類別內,有兩個(含)以上之方法,具有相同之名稱,但其宣告之類型或參數個數卻不相同 • 其目的是因應不同的傳遞資料,讓方法更有彈性 2014/9/9 37
Q9: 方法多載 • class adder{ • int add(int i,int j){return i+j;} • double add(double i,double j){return i+j;} • } • class Ex2_10_1{ • public static void main(String[] args){ • int n; • double x; • adder a= new adder(); • n=a.add(2,3); • x=a.add(2.2, 3.3); • System.out.println("int n = " + n); • System.out.println("double x = " + x); • } • } 2014/9/9 38
Q9: 方法多載 • class adder{ • int n; • double x; • adder(int i, int j){ • n= i+j; • System.out.println("use_int= "+n); • } • adder(double i, double j){ • x= i+j; • System.out.println("use_double= "+x); • } • } • class Ex2_10_2{ • public static void main(String[] args){ • adder use_int= new adder(2,3); • adder use_double= new adder(2.2, 3.3); • } • } 2014/9/9 39
Q10: public(公用)/private(私用)存取設定 • 當變數前置public時,即為公用變數,其他物件均可存取應用 • 當變數前置private時,即為私用變數,只有類別內宣告的方法可以取用,其他物件均不得存取應用 • 當變數無前置任何存取設定時,僅允許在,同一package存取應用 2014/9/9 40
Q10: public(公用)/private(私用)存取設定 • class Mynumber { • int i; • public int j; • } • class Ex2_11_1 { • public static void main(String[] args) { • Mynumber a = new Mynumber(); • a.i = 10; • a.j = 20; • System.out.println("a.i = "+a.i+", a.j = "+a.j); • } • } 2014/9/9 41
Q10: public(公用)/private(私用)存取設定 • class Mynumber { • int i; • private int j; • } • class Ex2_11_2 { • public static void main(String[] args) { • Mynumber a = new Mynumber(); • a.i = 10; • a.j = 20; • System.out.println("a.i = "+a.i+", a.j = "+a.j); • } • } 2014/9/9 42
Q10: public(公用)/private(私用)存取設定 • class Mynumber { • int i; • private int j; • } • class Ex2_11_2 { • private int k = 10; • public static void main(String[] args) { • Mynumber a = new Mynumber(); • a.i = 10; • Ex2_11_2 b = new Ex2_11_2(); • //a.j = 20; • System.out.println("a.i = "+a.i); • System.out.println("b.k = " +b.k); • } • } 2014/9/9 43
Q10: public(公用)/private(私用)存取設定 • class Mynumber { • private int number; • public void setnumber(int i) { number=i;} • public int getnumber() { return number; } • } • class Ex2_11_3 { • public static void main(String[] args) { • Mynumber a = new Mynumber(); • a.setnumber(10); • System.out.println("result= "+a.getnumber()); • } • } 2014/9/9 44
Q11: this 之應用 • This之意義為所屬類別之代名詞 • This可用於建構子間之呼叫 • 使用this呼叫建構子時,僅可在一建構子中,呼叫另一建構子 • 使用this呼叫建構子時,this 必須置於第一行 • 不能造成建構子遞迴 2014/9/9 45
Q11: this 之應用 • class Mynumber { • private int number; • public Mynumber(int i){ • this.number= i; • } • public int getnumber(){return number;} • } • class Ex2_12_1 { • public static void main(String[] args) { • Mynumber a = new Mynumber(10); • System.out.println("result= "+a.getnumber()); • } • } 2014/9/9 46
Q11: this 之應用 • class Mynumber { • private int number; • public Mynumber(int i){this.number= i;} • public Mynumber(int j, String s){this(j);} • public int getnumber(){return number;} • } • class Ex2_12_2 { • public static void main(String[] args) { • Mynumber a = new Mynumber(10, "stringtest"); • System.out.println("result= "+a.getnumber()); • } • } 2014/9/9 47
Q12: 物件陣列 • class Mynumber { • private int number; • public void setnumber(int i) { number=i;} • public int getnumber() { return number; } • } • class Ex2_13_1 { • public static void main(String[] args) { • int[] intArray; • Mynumber[] MyArray; • intArray = new int[2]; • intArray[0] = 5; • intArray[1] = 10; • System.out.println("intArray[0]= "+intArray[0]); • System.out.println("intArray[1]= "+intArray[1]); • MyArray = new Mynumber[2]; • MyArray[0] = new Mynumber(); • MyArray[1] = new Mynumber(); • MyArray[0].setnumber(15); • MyArray[1].setnumber(20); • System.out.println("MyArray[0].number= "+MyArray[0].getnumber()); • System.out.println("MyArray[1].number= "+MyArray[1].getnumber()); • }} 2014/9/9 48
Q13: 巢狀類別應用 • 類別的定義也可以放置於另一個類別之內,甚至是某個方法之內;這種類別稱為內部類別(巢狀類別) 2014/9/9 49
Q13: 巢狀類別應用-成員類別 • class Ex2_14_1 { • int i,j; • private MyMember memb; • class MyMember { • int m,n,o; • MyMember() { • i = 2; • Ex2_14_1.this.j = 4; • m = 12; • this.n = 14; • MyMember.this.o = 16; } • public int getO() { return o; } } • public Ex2_14_1() { • memb = new MyMember(); • System.out.println("m= "+memb.m + ","+"n= "+memb.n + ","+ • "o= "+memb.getO()); } • public int getJ() { return j; } • public static void main(String[] args) { • Ex2_14_1 a = new Ex2_14_1(); • System.out.println("i= "+a.i +","+ • "j= "+a.getJ()); }} 2014/9/9 50