多型的總結
多型
多型:是指物件的多種狀態;
多型的前提:
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();//我在家看門
}
}
}
相關文章
- 泛型總結泛型
- Python的資料型別總結Python資料型別
- Go 的資料型別總結Go資料型別
- 【多執行緒總結(一)-基礎總結】執行緒
- 揹包題型總結
- JavaScript基本型別總結JavaScript型別
- Mysql支援的資料型別(總結)MySql資料型別
- golang 多協程的同步方法總結Golang
- JAVA入門學習初步總結3 方法類繼承多型等Java繼承多型
- OOM異常型別總結OOM型別
- [python] Python型別提示總結Python型別
- JS 資料型別總結JS資料型別
- 【多執行緒總結(四)-三大性質總結】執行緒
- iOS 多執行緒總結iOS執行緒
- PWA 開發總結(坑多)
- noip多校聯考總結
- golang 中的四種型別轉換總結Golang型別
- 後臺面試型別總結面試型別
- 工作三年多的感慨與總結(一)
- python多執行緒的優缺點總結Python執行緒
- 用多項式的逆優化dp總結優化
- Java 多執行緒 - 總結概述Java執行緒
- 【乾貨】驗證碼的常見型別總結型別
- C++的資料型別總結,不能錯過C++資料型別
- c# 操作Redis的五種基本型別總結C#Redis型別
- Java知識點總結(Java泛型)Java泛型
- JavaScript變數型別檢測總結JavaScript變數型別
- Python str型別學習總結(一)Python型別
- [LeetCode] 動態規劃題型總結LeetCode動態規劃
- Flume 總結(三)sources型別-1.9.0新版型別
- go 基礎總結 --- 資料型別Go資料型別
- JavaScript資料型別轉換總結JavaScript資料型別
- leetcode 常見題型程式碼總結LeetCode
- PHP弱型別安全問題總結PHP型別
- Java 的多型Java多型
- 多型的概述多型
- 陣列的三種宣告方式總結、多維陣列的遍歷、Arrays類的常用方法總結陣列
- 2019Android多執行緒總結Android執行緒