面向物件12:什麼是多型
阿新 • • 發佈:2020-08-16
多型
- 動態編譯:型別—>可擴充套件性
- 即同一方法可以根據傳送物件的不同而採取不同的行為方式。
- 一個物件的實際型別是確定的,但可以指向物件的引用的型別有很多 (父類,有關係的類)
多型存在的條件
- 有繼承關係
- 子類重寫父類方法
- 父類引用指向子類
注意:多型是方法的多型,屬性沒有多型性。
instanceof ()型別轉換)y引用型別
多型注意事項
1、多型是方法的多型,屬性沒有多型
2.父類和子類,有聯絡 型別轉換異常! ClassCastException!
3.存在的條件:繼承關係,方法需要重寫,父類引用指向了子類物件!Father f1 = New Son();
方法不能被重寫的情況
1.static 方法,屬於類,他不屬於例項
2.final 常量
3.private 方法
程式碼示例:
application2.java
package com.oop.Demo06; public class Application2 { public static void main(String[] args) { //一個物件的實際型別是確定的 // new Person(); // new Student(); //可以指向的引用型別就不確定了,父類的引用指向子類的型別 //Student 能呼叫的方法都是自己的或者繼承父類的 Student s1 = new Student(); //可以指向的引用型別就不確定了,父類的引用指向子類的型別 //Student 能呼叫的方法都是自己的或者繼承父類的 Person s2 = new Student(); //Person 父型別,可以指向子類,但是不能呼叫子類獨有的方法 Object s3 = new Student(); //物件能執行哪些方法。主要看左邊的型別,和右邊關係不大 s1.run(); //son s2.run(); //子類重寫了父類的方法,執行子類的方法 ---son System.out.println("=============="); s1.crash(); s2.crash(); System.out.println("=============="); s1.foot(); s2.foot(); System.out.println("=============="); s1.eat(); ((Student) s2).eat(); } } 輸出: run1 run1 ============== crash1 crash1 ============== foot1 foot1 ============== eat1 eat1 程序已結束,退出程式碼 0
student.java
package com.oop.Demo06; public class Student extends Person { public void run() { System.out.println("run1"); } public void crash() { System.out.println("crash1"); } //子類無foot方法 public void eat() { System.out.println("eat1"); } }
person.java
package com.oop.Demo06;
public class Person {
public void run() {
System.out.println("run2");
}
public void crash() {
System.out.println("crash2");
}
public void foot() {
System.out.println("foot1");
}
//父類無eat方法
}