Docstoc

06. 物件導向基本概念

Document Sample
06. 物件導向基本概念 Powered By Docstoc
					物件導向基本概念


         李紹群
 learry@pavo.seed.net.tw
                         物件導向基本概念




物件的基本概念(Object)
 物件的內容
    屬性(property)
    方法(method)
 物件的特性
    繼承(inheritance)
    多型(polymorphism)
    資料隱藏(data hiding)



                               2
                                                                 物件導向基本概念




類別(Class)
 什麼是類別
        將資料結構本身以及操作此資料結構的方法封
         裝起來
 類別的宣告
 class 類別名稱 {              class Person {
     資料型態       屬性;            String name;
     ……..
                               String birthday;
     傳回值的資料型態 方法名稱(參數) {
         敘述;
                               public void sayHello() {
         ……..
         return 傳回值;               System.out.println("大家好!");
     }                         }
 }                         }
                                                                       3
                            物件導向基本概念




使用物件
 建立物件
    john = new Person();
    Person 是類別, john 是物件
 屬性的宣告及存取
    物件名稱.屬性
    物件名稱.屬性 = 值;
 方法的呼叫
    物件名稱.方法(參數)


                                  4
                                                            物件導向基本概念




屬性的宣告及存取
/* 宣告 Person類別 */
class Person {
   String name;
   String birthday;
}

public class Person1 {
  public static void main(String[] args) {
     Person p1;

        /* 建立 Person 物件 */
         p1 = new Person();
         p1.name = "John";
         p1.birthday="1911/10/10";

        System.out.println("Person1的姓名為:" + p1.name);
        System.out.println("Person1的生日為:" + p1.birthday);
    }
}
                                                                  5
                                                       物件導向基本概念




方法的宣告及呼叫
/* 宣告 Person類別 */
class Person {
   String name, birthday;

    public void sayHello() {
      System.out.println(name + "向大家問好");
    }
}

public class Person2 {
  public static void main(String[] args) {
     Person p1;

        /* 建立 Person 物件 */
         p1 = new Person();
         p1.name = "John"; p1.birthday="1911/10/10";

        System.out.println("物件建立完畢!");
        p1.sayHello();
    }
}                                                            6
                            物件導向基本概念




課堂練習
 請建立一個日期資料的類別(Date),包含屬性
 年(year)、月(month)、日(day)以及顯示日期的
 方法(printDate),並完成一個程式顯示今天與
 明天日期的程式。例如(2005/10/31)




                                  7
                        物件導向基本概念




資料成員的存取
 public 修飾子
     資料成員或方法可以讓其他類別存取或呼叫
 protected 修飾子
    資料成員或方法僅能讓類別本身或者子類別存
     取或呼叫
 private 修飾子
     資料成員或方法僅能在類別本身存取或呼叫



                              8
                                                          物件導向基本概念




資料成員的存取
/* 宣告 Person類別 */
class Person {
   public String name;
   private String birthday;

    public void setBirthday(String date) {
      birthday = date;
    }
    public String getBirthday() {
      return birthday;
    }
}

public class Person3 {
  public static void main(String[] args) {
      Person john;

        /* 建立 Person 物件 */
        john = new Person();
        john.name = "John";
        john.setBirthday("1911/10/10");
        System.out.println("姓名為" + john.name);
        System.out.println("生日為" + john.getBirthday());
    }
}
                                                                9
                                           物件導向基本概念




課堂練習
 請將之前建立的日期物件加上判斷日期是否正
 確的方法validDate判斷日期是否正確該方法型
 態為
 private boolean validDate(int d, int m, int y)




                                                  10
                           物件導向基本概念




建構子(Constructor)
 在物件一開始建立時便會執行
    建構子與類別同名,例如 Person 的建構函式為
     Person();
    建構子沒有傳回值
    建構子的方法支援多載(Overload)




                                 11
                                                            物件導向基本概念




建構子範例
/* 宣告 Person類別 */
class Person {
    String name, birthday;

    public Person () {
      System.out.println("正在建立Person類別的物件");
    }
}

public class Person4 {
  public static void main(String[] args) {
     Person p1;

        /* 建立 Person 物件 */
         p1 = new Person();
         p1.name = "John";
         p1.birthday="1911/10/10";

        System.out.println("Person1的姓名為:" + p1.name);
        System.out.println("Person1的生日為:" + p1.birthday);
    }
}                                                                12
                            物件導向基本概念




this 參照子
 在類別的成員方法和建構子可以使用 this 關鍵
 字參考目前的副本方法和變數
    如果方法的參數列和副本變數名稱相同則
        this.變數名稱表示是副本變數




                                 13
                                                            物件導向基本概念




/* 宣告 Person類別 */
class Person {
    String name, birthday;

    public Person (String name, String birthday) {
      System.out.println("正在建立Person類別的物件");
      this.name = name;
      this.birthday = birthday;
    }
}

public class Person5 {
  public static void main(String[] args) {
     Person p1;

        /* 建立 Person 物件 */
         p1 = new Person("John", "1911/10/31");

        System.out.println("Person1的姓名為:" + p1.name);
        System.out.println("Person1的生日為:" + p1.birthday);
    }
}                                                                14
                                     物件導向基本概念




多載化(overloading)
 一個類別擁有一個以上相同名稱的方法
    String類別中的 valueOf 方法
        valueOf(int) : 將整數轉為字串
        valueOf(float) : 將浮點數轉為字串




                                          15
                                                            物件導向基本概念




/* 宣告 Person類別 */
class Person {
   String name, birthday;

    public Person() {
      System.out.println("正在建立Person物件");
      name="Bob"; birthday="1923/2/2";
    }

    public Person (String name, String birthday) {
      System.out.println("正在建立Person類別的物件");
      this.name = name; this.birthday = birthday;
    }
}

public class Person5 {
  public static void main(String[] args) {
     Person p1,p2;

        /* 建立 Person 物件 */
         p1 = new Person("John", "1911/10/31");

        p2 = new Person();

        System.out.println("Person1的姓名為:" + p1.name);
        System.out.println("Person1的生日為:" + p1.birthday);
        System.out.println("Person2的姓名為:" + p2.name);
        System.out.println("Person2的生日為:" + p2.birthday);
    }                                                            16
}
                      物件導向基本概念




課堂練習
 請將Date類別建立建構子當物件建立時將日期
 設定為1900/1/1




                           17
                                 物件導向基本概念




終結者(Finalizer)
 在物件被資源回收(garbage collection)前執行
  的方法
 garbage collection
     Java處理物件的終結機制
     會將物件所佔用的記憶體釋放出來
 方法宣告
     procted void finalizer()



                                      18
                                                            物件導向基本概念




/* 宣告 Person類別 */
class Person {
    String name, birthday;

    public Person () {
      System.out.println("正在建立Person類別的物件");
    }
    public void finalizer() {
      System.out.println("Person類別的物件將被回收");
    }
}

public class Person6 {
  public static void main(String[] args) {
     Person p1;

        /* 建立 Person 物件 */
         p1 = new Person();
         p1.name = "John"; p1.birthday="1911/10/10";

        System.out.println("Person1的姓名為:" + p1.name);
        System.out.println("Person1的生日為:" + p1.birthday);
        p1 = null;
        System.gc(); // 呼叫資源回收
        p2 = new Person();
                                                                 19
    }
}
                             物件導向基本概念




課堂練習
 請將Date類別新增終結者,告訴使用者目前的
 日期即將過去,(例如 1900/1/1 即將過去)




                                  20
                                物件導向基本概念




繼承(Inheritance)
 一個類別可以直接繼承現存類別的部份或者全部的成
  員資料和方法,並可以增加額外的成員資料或方法
 子類別繼承父類別的方法和變數
     使用 extends 關鍵字
  class 子類別名稱 extends 父類別名稱 {
      宣告及敘述
      ……….
  }
 存取父類別
   使用 super 關鍵字



                                     21
                                                      物件導向基本概念




父類別宣告
/* 宣告Vehicle 類別 */
class Vehicle {
   //成員資料
   private int engineNo;
   private int owner;

    public void setNumber(int no) {        //設定引擎號碼
      engineNo = no;
    }
    public void setOwner(int owner) {      //設定所有人
      this.owner = owner;
    }
    public void printVehicle() {    //顯示車輛資料
      System.out.println("所有人: " + owner);
      System.out.println("引擎號碼: " + engineNo);
    }
}




                                                           22
                                                 物件導向基本概念




子列類別宣告
/* 宣告 Car 類別 */
class Car extends Vehicle {
   //成員資料
   private int doors; //幾門

    public Car(int owner, int no, int doors) {
      setNumber(no); // 呼叫父類別的成員方法
      setOwner(owner);
      this.doors = doors;
    }

    public void printCar() {
      System.out.println("====車輛資料====");
      printVehicle();
      System.out.println("車門: " + doors);
    }
}




                                                      23
                                             物件導向基本概念




主程式
public class CarExample1 {
  //主程式
  public static void main(String[] args) {
     //宣告Car 類別型態物件並建立物件
     Car sentra = new Car(1, 123456, 4);
     Car civic = new Car(2, 456789, 2);

        // 更改所有人
        sentra.setNumber(234567);

        //呼叫物件方法
        sentra.printCar();
        civic.printCar();
    }
}




                                                  24
                            物件導向基本概念




課堂練習
 請建立Bicycle單車的類別,內含色彩(color),
 車型(style)和車價(price)等資料以及顯示單車
 資料的方法(printBicycle),然後建立子類別競
 速單車(RacingBike),新增幾段變數(geer)的
 成員和顯示單車資訊的方法(showBicycle)




                                 25
                           物件導向基本概念




類別(static)方法與變數
 何謂類別方法與變數
    不需要事先生成物件,就可以直接呼叫使用
    呼叫方式 :
         類別.方法(參數);
         類別.變數;
    Integer.parseInt();
 宣告方式
    加上 static 關鍵字


                                26
                             物件導向基本概念




複寫和隱藏父類別的方法
 覆寫(Override)
     若父類別的方法不符合需求,可在子列別中宣
      告一個同名、同參數和傳回值的方法來取代父
      類別
 隱藏(Hide)
     物件的副本方法不能取代類別方法(static),若
      父類別擁有類別方法,我們在子類別宣告同樣
      的類別方法來取代他



                                  27
                                                  物件導向基本概念




父類別宣告
/* 宣告Vehicle 類別 */
class Vehicle {
   //成員資料
   private int engineNo;
   private int owner;

    // 類別方法
    public static void printBrand() {
       System.out.println("品牌: Renault");
    }

    public int getNumber() { return engineNo; }

    public int getOwner() { return owner; };

    public void setNumber(int no) {   //設定引擎號碼
      engineNo = no;
    }
    public void setOwner(int owner) { //設定所有人
      this.owner = owner;
    }
    public void printVehicle() {      //顯示車輛資料
      System.out.println("所有人: " + owner);
      System.out.println("引擎號碼: " + engineNo);
    }
}                                                      28
                                                 物件導向基本概念




子列類別宣告
/* 宣告 Car 類別 */
class Car extends Vehicle {
   //成員資料
   private int doors; //幾門

    public Car(int owner, int no, int doors) {
      setNumber(no); // 呼叫父類別的成員方法
      setOwner(owner);
      this.doors = doors;
    }

    public static void printBrand() {
      System.out.println("品牌: Honda");
    }
    public void printCar {
      System.out.println("====車輛資料====");
      printVehicle();
      System.out.println("車門: " + doors);
    }
}

                                                      29
                                             物件導向基本概念




主程式
public class CarExample2 {
  //主程式
  public static void main(String[] args) {
     //宣告Car 類別型態物件並建立物件
     Car city = new Car(1, 123456, 4);

        // 更改所有人
        city.setOwner(2);

        //呼叫物件方法
        city.printBrand();
        city.printCar();
    }
}




                                                  30
                              物件導向基本概念




隱藏父類別的資料成員
 隱藏父類別的資料成員只要變數名稱相同即可,
  即使型態不同一樣也可以隱藏
Class Vehicle {
  private int owner;
  ………….
}


Class Car extends Vehicle {
   private String owner;
   ……
}




                                   31
                                                      物件導向基本概念




父類別宣告
/* 宣告Vehicle 類別 */
class Vehicle {
   //成員資料
   private int engineNo;
   private int owner;

    public int getNumber() { return engineNo; }

    public int getOwner() { return owner; };

    public void setNumber(int no) {        //設定引擎號碼
      engineNo = no;
    }
    public void setOwner(int owner) {      //設定所有人
      this.owner = owner;
    }
    public void printVehicle() {    //顯示車輛資料
      System.out.println("所有人: " + owner);
      System.out.println("引擎號碼: " + engineNo);
    }
}
                                                           32
                                                    物件導向基本概念




子列類別宣告
/* 宣告 Car 類別 */
class Car extends Vehicle {
   //成員資料
   private int doors;    //幾門
   private String owner;

    public Car(String owner, int no, int doors) {
      setNumber(no); // 呼叫父類別的成員方法
      this.owner = owner;
      this.doors = doors;
    }
    public void printCar {
      System.out.println("====車輛資料====");
      printVehicle();
      System.out.println("車門: " + doors);
    }
}




                                                         33
                                                物件導向基本概念




主程式
public class CarExample {
  //主程式
  public static void main(String[] args) {
     //宣告Car 類別型態物件並建立物件
     Car city = new Car("Sentra", 123456, 4);


        //呼叫物件方法
        city.printCar();
    }
}




                                                     34
                     物件導向基本概念




使用父類別建構子
 子類別不能繼承父類別的建構子,只能在子類
  別中使用super關鍵字呼叫父類別的建構子
 若被子類別覆寫的方法和隱藏的成員變數,也
  可以使用super來呼叫及存取




                          35
                                            物件導向基本概念




父類別宣告
/* 宣告Vehicle 類別 */
class Vehicle {
   //成員資料
   public static int count=0;
   public int engineNo;
   public int owner;

    public Vehicle(int owner, int no) {
      this.owner = owner;
      engineNo = no;
      count++;
    }

    public void printVehicle() { //顯示車輛資料
      System.out.print("Nission");
    }
}


                                                 36
                                                          物件導向基本概念




子列類別宣告
/* 宣告 Car 類別 */
class Car extends Vehicle {
   //成員資料
   private int doors;      //幾門
   private int engineNo;
   private int owner;

    public Car(int owner, int no, int doors) {
      super(owner, no);
      owner = 100;
      engineNo = 100000;
      this.doors = doors;
    }

    public void printVehicle() {
      super.printVehicle();
      System.out.println("====車輛資料====");
      System.out.println("所有人(父): " + super.owner);
      System.out.println("引擎號碼(父): " + super.engineNo);
      System.out.println("所有人(子): " + owner);
      System.out.println("引擎號碼(子): " + engineNo);
      System.out.println("車門: " + doors);
      System.out.println("車輛數: " + count);
    }
}
                                                               37
                                             物件導向基本概念




主程式
public class CarExample4 {
  //主程式
  public static void main(String[] args) {
     //宣告Car 類別型態物件並建立物件
     Car sentra = new Car(1, 123456, 4);
     Car civic = new Car(2, 56789, 2);

        //呼叫物件方法
         sentra.printVehicle();
         civic.printVehicle();
    }
}




                                                  38
                                  物件導向基本概念




抽象類別(1)
 抽象類別(Abstract)
     提供類別繼承的基礎
          使用 abstract 關鍵字
          子類別必須實作
      abstract class 類別名稱 {
        ……………..
        //抽象方法
        abstract void 方法名稱(參數);
      }




                                       39
                             物件導向基本概念




抽象類別(2)
 抽象類別不能建立物件但是可以宣告成參考子類別副
 本的變數
 抽象類別 物件名稱 = new 子類別(參數);
 判斷物件的類別

 if (物件 instanceof 類別) {

     ……..
     // 物件是該類別時執行
 }

 類別轉換
    參考子類別的物件不能直接使用子類別的變數跟方法必須經
     過轉換才可以使用
 子類別 物件名稱 = (子類別) 參考子類別物件;
                                  40
                            物件導向基本概念




抽象父類別
/* 宣告 Shape 類別 */
abstract class Shape {
   //成員資料
   public double x;
   public double y;

    //抽象方法:計算面積
    abstract void area();
}




                                 41
                                                    物件導向基本概念




子類別
/* 宣告 Circle 類別 */
class Circle extends Shape{
   //成員資料
   public double r;

    //建構子
    public Circle(double x, double y, double r) {
       this.x = x;
       this.y = y;
       this.r = r;
    }
    public void area() {
       System.out.println("圓形面積:" + 3.1416*r*r);
    }
}

                                                         42
                                                       物件導向基本概念




主程式
public class ShapeExample1 {

    public static void main(String[] args) {

        Circle c; // 抽象類別的物件變數
        Circle c1 = new Circle(5.0, 1.0, 4.0);
        Shape c2 = new Circle(10.0, 10.0, 7.0);
        //顯示圓形資料
        System.out.println("圓形c1的資料");
        System.out.println("X座標: " + c1.x);
        System.out.println("Y座標: " + c1.y);
        System.out.println("半徑: " + c1.r);
        c1.area();

        if (c2 instanceof Circle) // 檢查是否為 Circle的副本
            System.out.println("c2 是 Circle 類別的副本");

        System.out.println("圓形c2的資料");
        System.out.println("X座標: " + c2.x);
        System.out.println("Y座標: " + c2.y);
        c = (Circle) c2; // 型別轉換
        System.out.println("半徑: " + c.r);
        c2.area();
    }
}
                                                            43
                       物件導向基本概念




多型
 使應用程式更容易擴充
    不需針對不同類型的資料建立類別
    只需繼承一個基礎類別建立同名的方法,即可
     處理不同的資料類型




                            44
                            物件導向基本概念




基礎類別
/* 宣告 Shape 類別 */
abstract class Shape {
   //成員資料
   public double x;
   public double y;

    //抽象方法:計算面積
    abstract void area();
}




                                 45
                                                   物件導向基本概念




子類別(1)
/* 宣告 Circle 類別 */
class Circle extends Shape{
   //成員資料
   private double r;

    //建構子
    public Circle(double x, double y,,
                                     double r) {
       this.x = x;
       this.y = y;
       this.r = r;
    }
    public void area() {
       System.out.println("圓形面積:" + 3.1416*r*r);
    }
}

                                                        46
                                                                   物件導向基本概念




子類別(2)
/* 宣告 Rectangle 類別 */
class Rectangle extends Shape{
   //成員資料
   private double x1;
   private double y1;
   //建構子
   public Rectangle (double x, double y, double x1, double y1) {
      this.x = x; this.y = y;
      this.x1 = x1; this.y1 = y1;
   }
   public void area() {
      System.out.println("矩形面積:" + (x1-x)*(y1-y));
   }
}



                                                                        47
                                                                物件導向基本概念




主程式
public class ShapeExample2 {

    public static void main(String[] args) {

        Shape s; // 抽象類別的物件變數
        Circle s1 = new Circle(5.0, 1.0, 4.0);
        Rectangle s2 = new Rectangle(10.0, 10.0, 20.0, 20.0);
        s = s1; //圓形
        s.area();

        s = s2; //矩形
        s.area();
    }
}




                                                                     48

				
DOCUMENT INFO
Shared By:
Categories:
Tags:
Stats:
views:4
posted:12/1/2012
language:Unknown
pages:48