1 / 89

Ch01 物件與類別複習

Ch01 物件與類別複習. 物件導向系統實務. 本章大綱. 以實例介紹物件導向的概念 以文字問答敘述複習物件類別的概念. 第一部份. 以實例介紹物件導向的概念. 類別與物件 (1/3). 實際世界:有一家吸塵機器人的製造工廠,工廠生產會自動行走的吸塵器,工廠生產了 1000 台機器。我家買了一台,你家也買了一台 物件:每一台吸塵機器人都有自己的實體,實體內包含有自己的名字、顏色 … 等特性值,例如: 我家的吸塵機器人、你家的吸塵機器人、還有其他的 998 台吸塵機器人 類別:包含屬性(特性)、建構子、方法(動作)等的設定,例如: 生產線上的模子.

gunnar
Download Presentation

Ch01 物件與類別複習

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Ch01 物件與類別複習 物件導向系統實務

  2. 本章大綱 以實例介紹物件導向的概念 以文字問答敘述複習物件類別的概念

  3. 第一部份 以實例介紹物件導向的概念

  4. 類別與物件(1/3) 實際世界:有一家吸塵機器人的製造工廠,工廠生產會自動行走的吸塵器,工廠生產了1000台機器。我家買了一台,你家也買了一台 物件:每一台吸塵機器人都有自己的實體,實體內包含有自己的名字、顏色…等特性值,例如:我家的吸塵機器人、你家的吸塵機器人、還有其他的998台吸塵機器人 類別:包含屬性(特性)、建構子、方法(動作)等的設定,例如:生產線上的模子

  5. 類別與物件(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 吸塵(){…} }

  6. 類別與物件(3/3) 吸塵機器人 name:String color:String instanceOf instanceOf 吸塵():void robot1:吸塵機器人 robot2:吸塵機器人 name:String = toto color:String=銀灰 name:String=月餅 color:String=紅 吸塵():void 吸塵():void

  7. 類別-如何建立一個類別(1/4) 類別的建立有兩個方法: 自己一行一行程式的去完成 善用已經存在的類別去組合完成

  8. 類別-如何建立一個類別(2/4) 實際世界:吸塵機器人的模子是這樣做的,吸塵機器人需要有三個技術結合: 吸塵器 感應器(偵測是否撞到墻?) 自動行走(類似玩具小汽車,會利用電力來前進) 工廠的設計部門當然不會自己設計這三個技術,他們會花錢購買這三個技術,再將這三個技術結合,再補加上一些設計,一個吸塵機器人的模子就完成了! 以物件導向的概念來看: 父類別:包含吸塵器、感應器、自動行走等類別 子類別:吸塵機器人 繼承:子類別繼承父類別,即子類別是新產物,而父類別是舊(已)有的技術 但是,JAVA是單一繼承,所以,在父類別中,吸塵器應該是吸塵機器人真正的父親;而感應器和自動行走,我們可以視為其輔助功能,我們以介面來實現 介面:類似類別,但是其方法沒有實作

  9. 類別-如何建立一個類別(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

  10. 類別-如何建立一個類別(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 走() { 直直的走; } }

  11. 多載(1/3) 實際世界:吸塵機器人已雛型完成,因為是智慧型的機器人,它會自己判斷現在地上是灰塵,還是可樂,還是固體加上液體。 這在物件導向程式設計中就是 多載:在一個類別中,有多個同名的方法,方法的回傳及參數個數或型式不同,例如: void 吸塵(液體) void 吸塵(固體) void 吸塵(液體,固體)

  12. 多載(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 走() { 直直的走; } }

  13. 多載(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

  14. 多型(1/3) 實際世界:工廠發現所設計的機器人打掃結果不理想,設計部門要做部份的修改,再生產吸塵機器人二世代。設計修改的部份是「走」,設計師發現原來的行動方向是類似「直線前進」,現在要做三種機器人: 機器人-A型:如乒乓球般撞到墻,會有一個回彈角度 機器人-B型:每次撞到墻,會產生一個亂數斜率,再以此斜率前進 機器人-C型:每次以旋轉方式前進

  15. 多型(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 { 螺旋型的走;}

  16. 多型(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怎麼走?

  17. 第二部份 以文字問答敘述複習物件類別的概念

  18. 類別與物件 • 程式之主體類別,其名稱必須與其儲存檔案之主檔名相同 • 主程式起始位置之字串public static void main(String [] args) • 物件之屬性或成員以句點“.”描述之 2014/9/9 18

  19. 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

  20. Q2: 原始型態與參考型態 • 原始型態為系統預設資料型態,如int、char、float、long、boolean等,可直接給予資料 • 參考資料為以設計之類別為資料型態,附以變數之型態,所以參考型態變數應先產生新物件,再給予資料 2014/9/9 20

  21. 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

  22. Q3: 生存物件之變數(屬性) • 當以某類別為資料型態之物件尚未建立時,其中所宣告之屬性,均無法存取。 • 如果要使用這些屬性,就必須先產生其所屬之物件 2014/9/9 22

  23. 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

  24. 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

  25. Q4: 類別之變數(類別屬性) • 於類別中宣告之變數,若加上static,該變數即謂類別變數,否則是生存物件變數 • 類別變數可直接使用,不必先產生物件 • 類別變數是同一類別中所有物件所共有,而不是屬於某個物件 2014/9/9 25

  26. 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

  27. 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

  28. Q5: 方法 • 類別中,所宣告之方法,類似一般高階語言的副程式 • 使用方法時,須先產生新物件再執行各新物件內之方法 • 使用( 呼叫)方法時,要注意傳入參數之一致性 • 參數型態一致 • 參數數量一致 • 宣告方法時,若無回傳資料,必須前置void,若有回傳資料,要註明回傳資料型態,且要有return 2014/9/9 28

  29. 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

  30. Q6: 物件方法 • 當方法所屬之物件尚未產生之前,該方法是無法執行的 2014/9/9 30

  31. 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

  32. 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

  33. Q7: 類別方法 • 類別方法於宣告時須前置static • 類別方法不同於物件方法,類別方法可直接使用 • 類別方法不可以直接呼叫物件方法,因為物件方法要先有物件存在,呼叫時要加上物件.方法() • 物件方法可以直接呼叫類別方法 2014/9/9 33

  34. 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

  35. Q8: 建構子 • 建構子之名稱必須與所屬類別之名稱相同 • 在沒有定義建構子的類別時,編繹器會自動設給一個沒有形式參數的建構子 • 建構子無回傳資料,內容無return,宣告中亦不得前置void • 建構子主要功能是在所屬類別產生新物件時作初始化動作 2014/9/9 35

  36. 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

  37. Q9: 方法多載 • 方法多載之定義為:在同一類別內,有兩個(含)以上之方法,具有相同之名稱,但其宣告之類型或參數個數卻不相同 • 其目的是因應不同的傳遞資料,讓方法更有彈性 2014/9/9 37

  38. 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

  39. 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

  40. Q10: public(公用)/private(私用)存取設定 • 當變數前置public時,即為公用變數,其他物件均可存取應用 • 當變數前置private時,即為私用變數,只有類別內宣告的方法可以取用,其他物件均不得存取應用 • 當變數無前置任何存取設定時,僅允許在,同一package存取應用 2014/9/9 40

  41. 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

  42. 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

  43. 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

  44. 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

  45. Q11: this 之應用 • This之意義為所屬類別之代名詞 • This可用於建構子間之呼叫 • 使用this呼叫建構子時,僅可在一建構子中,呼叫另一建構子 • 使用this呼叫建構子時,this 必須置於第一行 • 不能造成建構子遞迴 2014/9/9 45

  46. 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

  47. 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

  48. 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

  49. Q13: 巢狀類別應用 • 類別的定義也可以放置於另一個類別之內,甚至是某個方法之內;這種類別稱為內部類別(巢狀類別) 2014/9/9 49

  50. 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

More Related