1. 程式人生 > 其它 >Day23 - 面向物件程式設計OOP 04

Day23 - 面向物件程式設計OOP 04

1. 多型

1.1 多型的概念

  • 動態編譯:型別(執行過程中才確定):可擴充套件性
  • 即同一方法可以根據傳送物件的不同而採用多種不同的行為方式。
  • 一個物件的實際型別是確定的,但可以指向物件的引用型別有很多

1.2 多型存在的條件

  • 有繼承關係
  • 子類重寫父類方法
  • 父類引用指向子類物件

example:

//父類
public class Person {

    public void run(){
        System.out.println("Person runs");
    }
}

//子類
package com.oop.demo06;

public class Student extends Person{

    @Override
    public void run() {
        System.out.println("Student runs");
    }

    public void eat(){
        System.out.println("Student eats");
    }
}

public static void main(String[] args) {

    //一個物件的實際型別是確定的
    //new Student();
    //new Person();

    //可以指向的引用型別就不確定了: 父類的引用指向子類
    //Student能呼叫的方法都是自己的或者繼承父類的
    Student s1 = new Student();
    //Person 父型別可以指向子類,但是不能呼叫子類獨有的方法
    Person s2 = new Student();
    Object s3 = new Student();

    s2.run();   //子類override重寫了父類的方法,執行子類的方法
    //若未重寫則呼叫父類的方法
    s1.run();

    //物件能執行哪些方法主要看物件左邊的型別,與右邊的關係不大
    s1.eat();

}


1.3 多型注意事項

  1. 多型是方法的多型,屬性沒有多型

  2. 父類和子類,有聯絡 只有父子型別才能轉換 否則型別轉換異常 ClassCastException

  3. 存在條件: 繼承關係,方法需要重

    父類引用指向子類物件! Father f1 = new Son();

    Notes:

    1. 有些方法不能被重寫:
      • static -- 屬於類的方法,不屬於例項
      • final -- 常量 在常量池中無法修改;
      • private方法
  • instanceof -- 型別轉換 引用型別的轉換

1.4 型別轉換

//型別之間的轉化:基本型別轉換  高低 64 32 16
//             父 Person 子 Student  
//高                  低    高轉低需要強制型別轉換
Person obj = new Student();
// student.go();  會報錯 因為student是Person型別
//student講這個物件轉換為Student型別,我們就可以使用Student型別的方法了

Student student = (Student)obj;
student.go();

Person person = student;  //子類轉換為父類可能丟失自己本來的一些方法
  1. 父類引用指向子類的物件
  2. 把子類轉換為父類,向上轉型可以直接轉換;
  3. 把父類轉為為子類,向下轉型:強制轉換,
  4. 方便方法的呼叫,減少重複的程式碼!簡潔