Java 2012.12.14
Outline 為什麼要物件導向? 物件導向的好處 Object-Oriented Programming 類別的宣告&物件的實作 Constructors
為什麼要物件導向? 物件導向是近年來發展出的一套程式設計的開發 概念,基於程式撰寫越來越龐大,參與的開發人 員更多,程序式的結構(procedure-oriented)缺 乏效率和可讀性,而且無法有效發展GUI軟體, 因此發展出的一套具物件概念的語言結構。 例:C++,JAVA
物件導向的好處: 1. 抽象化 ( Abstraction ) 思考物件的思維, 用抽象化的思維來思考複雜的程式, 注重物件與外界溝通的行為, 可達到資料隱藏的目的。 2. 封裝 ( Encapsulation ) 將資料包裝在類別內部, 限定特定的函數存取, 使別人無法得知物件內的運作情形。 3. 繼承 ( inheritance ) 將繼有類別的功能, 透過繼承的方式, 將此功能繼承給新的類別使用。 4. 多型 ( polymorphism ) 允許相同名稱的函數針對引數的不同而有不同的處理動作。 5. 動態繫結 ( Dynamic binding ) 將物件的方法函式位址建立成一個虛擬表格(Virtual Table), 在執行階段時,判斷該呼叫哪一個物件的方法函式, 以達到物件多型(polymorphism)的目的。
Object-Oriented Programming (OO 、OOP 物件導向程式語言) Java 比擬為一部電影,要有: 導演: 想劇情 編劇: 安排劇中角色、道具、場景的人 演員: 舞台上照著劇本實際演出的人
西遊記 導演: 你 角色: 猴子、豬、雲 演員: 孫悟空、小猴子A、小猴子B、豬八戒、雲A 、雲B 名稱 孫悟空 小猴子A 小猴子B 雲A 表情 位置 表情 位置 表情 位置 顏色 位置 顏色 位置 表情 位置 屬性 七十二變 搥背 搥背 飄動 飄動 吃東西 行為
我會飄動 我會飄 雲A 我會七十二變 雲B 我會吃東西 我會搥背 我會搥背 孫悟空 小猴子B 小猴子A 豬八戒
類別的宣告&物件的實作 物件的實作 類別的宣告: 猴子 小猴子A = new 猴子(); class 猴子 小猴子A.表情 = 大笑; { 位置 public 搥背() 幫別人搥背; }
“猴子、豬、雲 “ 是類別(class) “孫悟空、小猴子A、小猴子B、豬八戒、雲A 、雲B” 是由類別實做出來的物件(object) “狀態、位置” 是類別的屬性(state、properties 、attribute) “七十二變、搥背、飄動、吃東西” 是類別的行為(behavior 、actions)
Constructors Constructors play the role of initializing objects. class Test{ int x,y; } public class NoConstructor{ public static void main(String[] argv){ Test a=new Test(); class Test{ int x,y; Test(){ } public class DefaultConstructor{ public static void main(String[] argv){ Test a=new Test();
CONSTRUCTORS 自行定義Constructors A constructor must have the same name as the class itself. Constructors do not have the return type, not even void.
Constructors 建立無參數的 Constructors class Test{ int x,y; Test(){ x=10; } public class NoArgument{ public static void main(String[] argv){ Test a=new Test(); System.out.println("x= "+a.x); System.out.println("y= "+a.y);
Constructors 建立有參數的Constructors class Test{ int x,y; Test(int initX,int initY){ x=initX; y=initY; } public class WithArgument{ public static void main(String[] argv){ Test a=new Test(30,40); System.out.println("x= "+a.x); System.out.println("y= "+a.y);
Constructors-OVERLOADING class Test{ int x=10,y=20; Test(){ } Test(int initX,int initY){ x=initX; y=initY; Test(int initX){ void show{ System.out.println("x= "+x); System.out.println("y= "+y); public class Overloading{ public static void main(String[] argv){ Test a=new Test(30,50); Test a=new Test(30); Test a=new Test();
TV.java + TestTV.java (課本p.327-328) 參考程式: TV.java + TestTV.java (課本p.327-328) public class TestTV { public static void main(String[] args) { TV tv1 = new TV(); tv1.turnOn(); tv1.setChannel(30); tv1.setVolume(3); TV tv2 = new TV(); tv2.turnOn(); tv2.channelUp(); tv2.volumeUp(); System.out.println(“tv1‘s channel is ”+ tv1.channel+“ and volume level is ” + tv1.volumeLevel); System.out.println("tv2'2 channel is " + tv2.channel +" and volume level is " + tv2.volumeLevel); }
public class TV { int channel =1; int volumeLevel=1; boolean on = false; public TV(){ } public void turnOn(){ on=true; public void turnOff(){ on=false; public void setChannel(int newChannel){ if(on && newChannel >= 1 && newChannel <=120){ channel = newChannel; public void setVolume(int newVolumeLevel){ if(on && newVolumeLevel >= 1 && newVolumeLevel <=120){ volumeLevel = newVolumeLevel; public void channelUp(){ if(on && channel <120){ channel++; public void channelDown(){ if(on && channel >1){ channel--; public void volumeUp(){ if(on && volumeLevel <7){ volumeLevel++; public void volumeDown(){ if(on && volumeLevel >1){ volumeLevel--;
參考程式: Car.java + TestTV.java /* Declaration Class */ import javax.swing.*; public class TestCar { public static void main(String[] args) Car car1 = new Car(); car1.speed = 120; car1.position = "Kaohsiung"; car1.drive(); car1.printID(); //呼叫static method Car car2 = new Car(); car2.carID = 200; //修改static variable //Car.printID(); }
public class Car { int speed = 0; String position = "Taipei"; static int carID = 100; Car(){ } void drive() //代表drive行為的method { System.out.println("The car is driving in " + position + " with " + speed + "km/hr"); void stop() //代表stop行為的method System.out.println("The car is stopping in " + position + " with 0km/hr"); int OilConsume(int oil) //計算油耗 return oil*10; static void printID() //static method System.out.println("Car ID is : " + carID);
practice 撰寫一個程式,其中包含一個類別Dates,並在建構方法中初 始化一個含有7個元素的字串陣列,各個元素對應到星期一 到星期天的英文縮寫,並提供一個方法askDate(),傳入1-7的 數字,傳回對應的英文縮寫 寫一個類別circle,代表一個圓,並提供多種建構方法可以透 過指定圓心座標及半徑或是一個包含此圓的最小正方形來建 立circle物件,同時定義方法可以計算圓周及圓面積
Ppt下載: http://oss.csie.fju.edu.tw/~jastine01/ppt.html