多型,向上向下轉型

亓亓fr發表於2021-11-24

多型

  1. 多型的前提:繼承
  2. 物件的多型:一個物件擁有多種形態,例如小明有學生形態,有人類形態
  3. 程式碼中體現多型性:其實就是一句話,父類引用指向子類物件
    Person p = new Student();
  4. 上句是向上轉型,一旦向上轉型為父類,就無法呼叫子類原本特有的內容
  • p就是Person類的例項物件,用p呼叫方法或屬性 p. n 或p. add()等就是呼叫Person類的內容,和Student類無關
  • 特例是:若Student類重寫了Person類的方法,p呼叫該方法相當於呼叫Student類的方法
public class Person {
	public int n = 0;
	public void test2() {
		System.out.println("test2_Person");
	}
}
public class Student extends Person{
	public int num = 1;
    public int age = 1
	public void test2() {
		System.out.println("test2_Student");
	} 
    public void test3(){
            System.out.println("test3")
    }
}

下述程式碼非常重要

public class Test2 {
	public static void main(String[] args) {
		Person p = new Student(); // 向上轉型
		p.test2();      // 子類重寫了父類方法,所以呼叫的是子類方法
            p.test3();      // 錯誤,p不可以呼叫Student類的方法
		System.out.println(p.n);   //屬性不可被重寫,所以呼叫的是父類屬性
        	System.out.println(p.age); //報錯,Person類和Object類沒該屬性
    }
}

使用多型的好處

舉例:

  1. 有一父類Employee員工類, n個子類講師類,助教類,教授類等
  2. Employee有抽象方法work(),每個子類都重寫work()
  3. 建立每個物件:
Employee one  = new Teacher();
Employee two  = new Assiatant();
Employee three  = new Professor();
  1. 帶來了統一性,每個物件都相當於一個類例項化來的,而且還有其特有的work方法
  2. 無論"="右邊new的時候換成哪個子類物件,等號左邊呼叫方法,屬性都不會變化
  3. 每個物件都統一起來了,他們除了work之外都有相通的屬性方法,比如身高,體重,專業等

上下轉型

  1. 向上轉型:其實就是多型寫法,向上轉型一定是安全的,
    父類名稱 物件名 = new 子類名稱();
  2. 向下轉型:還原向上轉型
    子類名稱 物件名 = (子類名稱)父類物件;
Animal animal = new Dog();
if (animal instanceof Dog){   // 看清大小寫
    Dog dog = (Dog) animal;
}
  1. 前提:
  • 向上轉型,只有向上轉型後才可以使用向下轉型
  • 向下轉型使用的子類名必須是向上轉型的子類名
  1. 切記:下述程式碼錯誤
Animal animal = new Animal();
Dog dog = (Dog) animal; // 報錯

Animal animal = new Cat();
Dog dog = (Dog) animal; // 報錯
  1. 為什麼要向下轉型:當使用多型(向上轉型)後,需要呼叫子類特有的方法
  2. 轉型需要配合 instanceof 使用

向上向下轉型有什麼意義?

  • 當傳入的引數不知道是什麼類時,可以用最底層父類修飾:
public static void giveMeAPet(Animal animal){
    if (animal instanceof Dog){
        Dog dog = (Dog) animal;
        dog.watchHouse;
    }
    if (animal instanceof Cat){
        Cat cat = (Cat) animal;
        cat.catchMouse;
    }
}

構造方法用private修飾:

  • 多用於單例模式
  • 要實現單例,還需要:
private static Person person = new Person();
public static Single getInstance() {
	return single;
}

相關文章