多型的總結

man凱發表於2020-10-01

多型

多型:是指物件的多種狀態;
多型的前提:
1.必須有子父類關係(有繼承);
2.必須有方法的重寫;

多型在java程式碼中的表現形式:
父類型別 變數名 = new 子類型別();
父介面 變數名 = new 實現類();
注意事項:
使用多型呼叫成員變數:
多型編譯執行時,都看父類;
使用多型呼叫成員方法:
編譯看父類,執行看子類;
多型的弊端:
多型 只能呼叫子父類共有的方法.不能呼叫子類特有的方法;
多型的好處:
提高程式的複用性與擴充套件性,靈活性;

//父類Animal
public abstract class Animal {
	//抽象方法
	public abstract void eat();
}
//子類Cat繼承Aminal父類
public class Cat extends Animal {
	//重寫方法
	public void eat() {
		System.out.println("我在吃魚");
	}
	public void catch() {
		System.out.println("我能抓老鼠");
	}
}
//子類Dog繼承Aminal父類
public class Dog extends Animal {
	//重寫eat方法
	public void eat() {
		System.out.println("我在咬骨頭");
	}
	public void watchDoor() {
		System.out.println("我在家看門");
	}
}

public class Test {
	public static void main(String[] args) {
		//建立貓,使用多型
		Animal an = new Cat();
		an.eat();//我在吃魚
		an.catch();//編譯時不報錯,執行時報錯,父類沒有此方法
		
		//建立狗,使用多型
		Abimal an1 = new Dog();
		an1.eat();//我在咬骨頭
		an1.watchDoor();//編譯時不報錯,執行時報錯,父類沒有此方法

		
	}
}

解決多型的弊端

向上向下轉型
向上轉型: 就是多型;
格式: 父類型別 變數名 = new 子類();
向下轉型: 相當於是自動型別轉換;
格式: 子類型別 變數名 = (子類型別)父類中的變數名;
變數名.子類特有的方法();

向下轉型也有弊端:
把父類的變數轉換成子類型別的時候,編譯器直接編譯通過;
解決方法: 使用關鍵字instanceof判斷;
instanceof的作用: 判斷該物件是不是該類的物件
格式: 物件名 instanceof 類名;

//父類Animal
public abstract class Animal {
	//抽象方法
	public abstract void eat();
}
//子類Cat繼承Aminal父類
public class Cat extends Animal {
	//重寫方法
	public void eat() {
		System.out.println("我在吃魚");
	}
	public void catch() {
		System.out.println("我能抓老鼠");
	}
}
//子類Dog繼承Aminal父類
public class Dog extends Animal {
	//重寫eat方法
	public void eat() {
		System.out.println("我在咬骨頭");
	}
	public void watchDoor() {
		System.out.println("我在家看門");
	}
}

public class Test {
	public static void main(String[] args) {
		//建立貓,使用多型
		Animal an = new Cat();
		an.eat();//我在吃魚
		an.catch();//編譯時不報錯,執行時報錯,父類沒有此方法
		
		//建立狗,使用多型
		Abimal an1 = new Dog();
		an1.eat();//我在咬骨頭
		an1.watchDoor();//編譯時不報錯,執行時報錯,父類沒有此方法

		Cat cat = (Cat)an1;//編譯時不出錯,執行時報錯	Dog can not cast to Cat
		
		//解決方法
		boolean flag = an instanceof Cat;
		if (flag) {
			Cat cat = (Cat)an;
			an.catch();//我能抓老鼠
		}
		boolean flag2 = an instanceof Dog;
		if (flag2) {
			Dog dog = (Dog)an;
			an.watchDoor();//我在家看門
		}
	}
}

相關文章