多型
- 多型的前提:繼承
- 物件的多型:一個物件擁有多種形態,例如小明有學生形態,有人類形態
- 程式碼中體現多型性:其實就是一句話,父類引用指向子類物件
Person p = new Student();
- 上句是向上轉型,一旦向上轉型為父類,就無法呼叫子類原本特有的內容
- 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類沒該屬性
}
}
使用多型的好處
舉例:
- 有一父類Employee員工類, n個子類講師類,助教類,教授類等
- Employee有抽象方法work(),每個子類都重寫work()
- 建立每個物件:
Employee one = new Teacher();
Employee two = new Assiatant();
Employee three = new Professor();
- 帶來了統一性,每個物件都相當於一個類例項化來的,而且還有其特有的work方法
- 無論"="右邊new的時候換成哪個子類物件,等號左邊呼叫方法,屬性都不會變化
- 每個物件都統一起來了,他們除了work之外都有相通的屬性方法,比如身高,體重,專業等
上下轉型
- 向上轉型:其實就是多型寫法,向上轉型一定是安全的,
父類名稱 物件名 = new 子類名稱();
- 向下轉型:還原向上轉型
子類名稱 物件名 = (子類名稱)父類物件;
Animal animal = new Dog();
if (animal instanceof Dog){ // 看清大小寫
Dog dog = (Dog) animal;
}
- 前提:
- 向上轉型,只有向上轉型後才可以使用向下轉型
- 向下轉型使用的子類名必須是向上轉型的子類名
- 切記:下述程式碼錯誤
Animal animal = new Animal();
Dog dog = (Dog) animal; // 報錯
Animal animal = new Cat();
Dog dog = (Dog) animal; // 報錯
- 為什麼要向下轉型:當使用多型(向上轉型)後,需要呼叫子類特有的方法
- 轉型需要配合 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;
}