1.多態的概念:同一個對象在不同時刻體現出來的不同狀態。
2.多態的前提:
A:有繼承或者實現關係。
B:有方法的重寫。(如果沒有重寫,使用多態就沒有意義)
C:有父類或父接口引用指向子類對象。
3.多態的分類
A:具體類多態
class Father{}
class Son extends Father{}
Father f=new Son();
B:抽象類多態
abstract class Father {}
class Son extends Father {}
Father f = new Son();
C:接口多態
interface Father {}
class Son implements Father {}
Father f = new Son();
4.多態中成員訪問特點
A:成員變量
編譯時看父類,運行看父類
B:構造方法
子類構造默認訪問父類構造
C:成員方法
編譯時看父類,運行時看子類
D:靜態方法
編譯時看父類,運行看父類
例:
class Father {
public int num = 100;
public void show() {
System.out.println("show Father");
}
public static void function() {
System.out.println("function Father");
}
}
class Son extends Father {
public int num = 1000;
public int num2 = 200;
public void show() {
System.out.println("show Son");
}
public void method() {
System.out.println("method Son");
}
public static void function() {
System.out.println("function Son");
}
}
class DuoTaiDemo {
public static void main(String[] args) {
//要有父類引用指向子類對象。
Father f = new Son();
//成員變量訪問特點
System.out.println(f.num); //輸出100,即運行看父類
//System.out.println(f.num2); //找不到符號,即編譯看父類,父類沒有該變量,所以報錯
//成員方法訪問特點
f.show(); //輸出show Son,即運行看子類
//f.method(); //找不到符號,即編譯看父類,父類沒有該方法,所以報錯
f.function(); //輸出function Father,即編譯看父類,有則通過,運行看父類,輸出父類結果
}
}
5.多態的好處
A:提高代碼的維護性(繼承體現)
B:提高代碼的擴展性(多態體現)
abstract class Animal {
public void shoot() {}
}
class Dog extends Animal {
public void shoot() {
System.out.println("汪汪");
}
}
class Cat extends Animal {
public void shoot() {
System.out.println("喵喵");
}
}
class Person{
private Animal animal;
public Person(){}
public Person(Animal animal){
this.animal=animal;
}
public void shoot(){
animal.shoot();
}
public void setAnimal(Animal animal){
//運用參數多態,以後方便養別的寵物
this.animal=animal;
}
}
public class Test {
public static void main(String[] args) {
//我喜歡貓,就養了一隻
Person p=new Person();
Cat c = new Cat();
p.setAnimal(c); //先養了只貓
p.shoot();
//我又喜歡狗了,所以換狗養
Dog d = new Dog();
p.setAnimal(d);
p.shoot();
//我喜歡寵物狼,老虎,豹子...
//只需要定義對應的類,繼承自Animal,提供對應的方法重寫 ,不用特地去Person類中添加。
}
}
6.多態的弊端與轉型父類不能使用子類的特有功能。
如:上文第4點,成員方法訪問特點。
那麼,如何改進才能調用呢?就用多態的轉型。
A:向上轉型
B:向下轉型
Father father = new Son();//向下轉型
Son son = (Son)father;//向上轉型
son.show();
son.method();
轉型後,就可以在不多佔用內存的情況下(創建子類對象)調用子類特有方法。
7.多態內存佔用圖解
A:多態繼承內存佔用圖解
B:多態中對象變化內存佔用
8.多態貓狗案例
/*
多態練習:貓狗案例
*/
class Animal {
public void eat(){
System.out.println("吃飯");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("狗吃肉");
}
public void lookDoor() {
System.out.println("狗看門");
}
}
class Cat extends Animal {
public void eat() {
System.out.println("貓吃魚");
}
public void playGame() {
System.out.println("貓捉迷藏");
}
}
class DuoTaiTest {
public static void main(String[] args) {
//定義爲狗
Animal a = new Dog();
a.eat();
System.out.println("--------------");
//還原成狗
Dog d = (Dog)a;
d.eat();
d.lookDoor();
System.out.println("--------------");
//變成貓
a = new Cat();
a.eat();
System.out.println("--------------");
//還原成貓
Cat c = (Cat)a;
c.eat();
c.playGame();
System.out.println("--------------");
//演示錯誤的內容
//Dog dd = new Animal();
//Dog ddd = new Cat();
//Dog dd = (Dog)a; //ClassCastException 類轉換出錯
}
}