Day23 - 面向物件程式設計OOP 04
阿新 • • 發佈:2021-06-19
1. 多型
1.1 多型的概念
- 動態編譯:型別(執行過程中才確定):可擴充套件性
- 即同一方法可以根據傳送物件的不同而採用多種不同的行為方式。
- 一個物件的實際型別是確定的,但可以指向物件的引用型別有很多
1.2 多型存在的條件
- 有繼承關係
- 子類重寫父類方法
- 父類引用指向子類物件
example:
//父類 public class Person { public void run(){ System.out.println("Person runs"); } } //子類 package com.oop.demo06; public class Student extends Person{ @Override public void run() { System.out.println("Student runs"); } public void eat(){ System.out.println("Student eats"); } } public static void main(String[] args) { //一個物件的實際型別是確定的 //new Student(); //new Person(); //可以指向的引用型別就不確定了: 父類的引用指向子類 //Student能呼叫的方法都是自己的或者繼承父類的 Student s1 = new Student(); //Person 父型別可以指向子類,但是不能呼叫子類獨有的方法 Person s2 = new Student(); Object s3 = new Student(); s2.run(); //子類override重寫了父類的方法,執行子類的方法 //若未重寫則呼叫父類的方法 s1.run(); //物件能執行哪些方法主要看物件左邊的型別,與右邊的關係不大 s1.eat(); }
1.3 多型注意事項
-
多型是方法的多型,屬性沒有多型
-
父類和子類,有聯絡 只有父子型別才能轉換 否則型別轉換異常 ClassCastException
-
存在條件: 繼承關係,方法需要重
父類引用指向子類物件! Father f1 = new Son();
Notes:
- 有些方法不能被重寫:
- static -- 屬於類的方法,不屬於例項
- final -- 常量 在常量池中無法修改;
- private方法
- 有些方法不能被重寫:
- instanceof -- 型別轉換 引用型別的轉換
1.4 型別轉換
//型別之間的轉化:基本型別轉換 高低 64 32 16 // 父 Person 子 Student //高 低 高轉低需要強制型別轉換 Person obj = new Student(); // student.go(); 會報錯 因為student是Person型別 //student講這個物件轉換為Student型別,我們就可以使用Student型別的方法了 Student student = (Student)obj; student.go(); Person person = student; //子類轉換為父類可能丟失自己本來的一些方法
- 父類引用指向子類的物件
- 把子類轉換為父類,向上轉型可以直接轉換;
- 把父類轉為為子類,向下轉型:強制轉換,
- 方便方法的呼叫,減少重複的程式碼!簡潔