1. 程式人生 > >Java學習-面向物件程式設計的三大特性(多型)

Java學習-面向物件程式設計的三大特性(多型)

文章目錄

一、基本含義

1.1 基本點

語法: 父類名 物件名 = new 子類名();

專案 含義
含義 同一個介面,使用不同的例項,進而執行不同的操作
優點 靈活、簡化、介面性,可替換、擴充性,消除型別間的耦合關係
必要條件 繼承、重寫、父類引用指向子類物件。

1.2 注意事項

1.2.1 多型使用——系統呼叫步驟

Animal cat = new Cat();
cat.eat();
使用多型方式呼叫方法時:

  1. 檢查父類是否有該方法。無則出錯。
  2. 父類有該方法時,去呼叫子類同名方法。
    這個過程也叫虛擬方法

Cat cat = new Cat();
cat.eat();
不使用多型方式呼叫方法時:

  1. 不會檢視父類。
  2. 直接呼叫子類方法。

1.2.2 父類引用指向子類物件

含義

  1. 物件名。objectName。
  2. 物件型別。父類名。
  3. 選用的建構函式。子類構造器。
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. 直接轉換:子轉父。
  2. 強制轉換:父轉子。
// =====================各自對應類定義物件===================
// 情況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("任務是看家護院!");
  }
}