目錄
一、什么是多態
二、多態實現的條件
三、實例分析
四、多態應用之一(多態數組)
五、多態參數
一、什么是多態
在Java中,多態是面向對象編程中的一個重要概念,它允許不同類型的對象對同一方法進行不同的實現。具體來說,多態性是指的是通過父類的引用變量來引用子類的對象,從而實現對不同對象的統一操作。
二、多態實現的條件
1.繼承關系
存在繼承關系的類之間才能夠使用多態性。多態性通常通過一個父類的引用指向子類的對象。
2.方法重寫
子類必須重寫(override)父類的方法。通過在子類中重新定義和實現父類的方法,可以根據子類的特點行為改變這個方法的行為。
3.父類引用指向子類對象
使用父類的引用變量來引用子類對象。這樣可以實現對不同類型的對象的統一操作,而具體調用哪個子類的方法會在運行時多態決定。
三、實例分析
public class JiCheng {public static void main(String[] args) {Animal animal = new Cat();animal.eat();}
}class Animal {void eat() {System.out.println("動物捕食");}
}class Cat extends Animal {@Overrideprotected void eat() {System.out.println("小貓吃魚");}
}class Dog extends Animal {@Overridepublic void eat() {System.out.println("小狗吃骨頭");}
}
首先要明白,多態是針對方法的來說的
我們看,Cat類和Dog類繼承自Animal類,并重寫了eat方法。常說的“編譯看左邊,運行看右邊”是說,animal作為父類的引用,它能調用的方法在編譯時就已經確定了,它作為父類的引用,父類的所有方法,都可調用。運行看右邊,是指,運行時,具體的方法,是看到底animal是什么類型的對象,上例可知,animal本質是Cat類的對象,所以實際效果是調用Cat類的方法。如果說,Cat類沒有重寫父類方法,則向上調用父類的方法。
這里涉及到Java的動態綁定,父類對象的引用綁定子類方法
對于子類中一些特有的方法,我們要讓他回歸本源,也就是強制轉換為Cat,回歸自我,右邊類型是Cat類,左邊也是Cat類引用接收,這里注意:我們只能強轉父類的引用,不能強轉父類對象,還有,不能強轉為Dog,因為它本質是Cat類。
如果是,調用屬性:則父類引用調用的是父類的屬性,屬性沒有多態一說;
public class JiCheng {public static void main(String[] args) {Animal animal = new Cat();animal.eat();Cat cat = (Cat) animal;cat.jiao();}
}class Animal {void eat() {System.out.println("動物捕食");}
}class Cat extends Animal {void jiao() {System.out.println("miaomiaomiao~");}@Overrideprotected void eat() {System.out.println("小貓吃魚");}
}
四、多態應用之一(多態數組)
public class DuoTaiShuZu {public static void main(String[] args) {Person[] people = new Person[5];people[0] = new Person();people[1] = new Teacher();people[2] = new Student();for (int i = 0; i < 5; i++) {if (people[i] instanceof Person) {people[i].say();} else if (people[i] instanceof Student) {Student person = (Student) people[i];person.study();} else if (people[i] instanceof Teacher) {((Teacher) people[i]).teach();}}}}class Person {String name;int age;void say() {System.out.println("人類可互相交流");}
}class Teacher extends Person {@Overridevoid say() {System.out.println("老師說要好好學習");}void teach() {System.out.println("老師教學生");}
}class Student extends Person {@Overridevoid say() {System.out.println("學生說要適當放松");}void study() {System.out.println("學生學知識");}
}
五、多態參數
方法定義形參為父類類型,實參允許為子類類型;
public class Test1 {public static void main(String[] args) {Test1 test1 = new Test1();Student student = new Student();Teacher teacher = new Teacher();test1.shitang(student);test1.shitang(teacher);}void shitang(Person a) {if (a instanceof Teacher) {((Teacher) a).teach();return;}a.eat();}
}class Person {void eat() {System.out.println("是個人就要吃飯");}
}class Student extends Person {@Overridepublic void eat() {System.out.println("學生在學生食堂吃飯");}void study() {System.out.println("學生上課");}
}class Teacher extends Person {@Overridepublic void eat() {System.out.println("老師在員工食堂吃飯");}void teach() {System.out.println("老師教書");}
}