Java學習-面向物件程式設計的三大特性(多型)
阿新 • • 發佈:2018-12-23
文章目錄
一、基本含義
1.1 基本點
語法: 父類名 物件名 = new 子類名();
專案 | 含義 |
---|---|
含義 | 同一個介面,使用不同的例項,進而執行不同的操作 |
優點 | 靈活、簡化、介面性,可替換、擴充性,消除型別間的耦合關係 |
必要條件 | 繼承、重寫、父類引用指向子類物件。 |
1.2 注意事項
1.2.1 多型使用——系統呼叫步驟
Animal cat = new Cat();
cat.eat();
當使用多型方式呼叫方法時:
- 檢查父類是否有該方法。無則出錯。
- 父類有該方法時,去呼叫子類同名方法。
這個過程也叫虛擬方法
Cat cat = new Cat();
cat.eat();
當不使用多型方式呼叫方法時:
- 不會檢視父類。
- 直接呼叫子類方法。
1.2.2 父類引用指向子類物件
含義
- 物件名。objectName。
- 物件型別。父類名。
- 選用的建構函式。子類構造器。
ParentClassName objectName = new ChildClassName();
1.3 多型的實現方式
1.3.1 方式一——重寫
1.3.2 方式二——介面
1.3.3 方式三——抽象類和抽象方法。
1.3 實參
實參型別 | 示例 |
---|---|
基本資料型別 | cat.eat(“蘋果”); |
引用資料型別 | num.findMax(arr1); |
例項物件 | eat(new Cat()); |
1.4 強制轉換——父子間
原則:
- 直接轉換:子轉父。
- 強制轉換:父轉子。
// =====================各自對應類定義物件===================
// 情況1:子可直接轉父。
Animal animal = new Animal();
Cat cat = new Cat();
animal = cat; // 結果:正確
// 情況2:子可直接轉父,但不能同時重複轉。
Animal animal = new Animal(); // 建立例項物件animal
Cat cat = new Cat(); // 建立例項物件cat
Dog dog = new Dog(); // 建立例項物件dog
animal = cat; // 結果:正確。子可直接轉父
animal = dog; // 結果:錯誤。但不能同時重複轉
// 情況3:父可強制轉子。
Animal animal = new Animal(); // 建立例項物件animal
Cat cat = new Cat(); // 建立例項物件cat
cat = (Cat)animal; // 結果:正確。父可強制轉子。
// =====================多型定義物件===================
// 情況1:子可直接轉父。
Animal animal = new Animal();
Animal cat = new Cat(); //
animal = cat; // 結果:正確。
// 情況2:子可直接轉父,但不能同時重複轉。
Animal animal = new Animal();
Animal cat = new Cat();
animal = cat; // 結果:正確。
animal = dog; // 結果:出錯。
// 情況3:父可強制轉子。
Animal animal = new Animal();
Animal cat = new Cat();
Cat cat = new Cat();
cat = (Cat)animal; // 正確。父可強制轉子。
// =====================各自對應類定義物件和多型定義物件===================
// 情況1: 。
Animal cat1 = new Cat();
Cat cat2 = new Cat();
cat2 = cat1; // 出錯
cat1 = cat2; // 正確
// 情況2: 。
Animal cat1 = new Cat();
Cat cat2 = new Cat();
cat2 = (Cat)cat1; // 正確
cat1 = cat2; // 正確
二、例項
動物:貓、狗。
主函式入口類:
public class MainEntrance{
public static void main(String[] args){
/* 類方法呼叫:例項物件作為實參。
* 等價於:
* Cat a = new Cat();
* show(a);
* 或者
* Animal b = new Cat(); // 多型方式。
*/
show(new Cat());
show(new Dog());
Animal a = new Cat();
a.eat();
Cat c = (Cat)a;
c.work();
}
public static void show(Animal a){ // 多型方式。父類引用,指向子類。
a.eat(); // 多型方式呼叫方法:先看父有無後調子方法。
if(a instanceof Cat){ // 判斷例項物件的型別。此時只知道a是動物。
Cat c = (Cat)a; // 強制轉換
c.work();
}else if(a instanceof Dog){
Dog c = (Dog)a;
c.work();
}
}
}
}
動物類:
public class Animal{
public void eat(){
System.out.println("都需要食物補充營養!");
}
}
貓類:
public class Cat extends Animal{
public void eat(){
System.out.println("喜歡吃魚");
}
public void work(){
System.out.println("任務是抓老鼠!");
}
}
狗類:
public Dog extends Animal{
public void eat(){
System.out.println("喜歡吃骨頭!");
}
public void work(){
System.out.println("任務是看家護院!");
}
}