多型的瞭解及應用
阿新 • • 發佈:2018-12-06
1.1多型的概述
多型是面向物件的三大特徵(封裝 繼承 多型)之一.
通俗理解:多型就是一種事物的多種形態,例如學生是人的一種,則一個具體的同學張三既是學生又是人,即出現了兩種形態.
專業的術語說就是:同一個實現介面,使用不同的例項而執行不同的操作。
1.2多型的定義和使用格式
定義格式:父類的引用變數指向子類物件
父類型別 變數名 = new 子類型別();
變數名.方法名();
普通類多型的定義的格式:
class Fu{}
class Zi extends Fu{ }
Fu fu = new Zi();
抽象類多型的定義的格式:
介面類多型的定義的格式:abstract class Fu{ public abstract void method(); } class Zi extends Fu{ @Override public void method() { } } Fu fu = new Zi();
interface Fu{
public abstract void method();
}
class Zi implements Fu{
@Override
public void method() {
System.out.println("重寫介面的方法");
}
}
Fu fu = new Zi();
注:當同一個父類的方法被不同子類重寫,在呼叫方法的時候,呼叫的為各個子類重寫後的方法:
Person p1 = new Student(); Person p2 = new Teacher(); p1.work(); //呼叫的是Student類重寫後的work方法 p2.work(); //呼叫的是Teacher類重寫後的work方法
1.3多型的成員變數和成員方法
1.3.1成員變數//父類 class Fu{ int num = 10; } //子類 class Zi extends Fu{ int num = 15; } //多型成員變數 //第一種:父類和子類中都有同名的變數----結果是:10 結果是:15 //第二種:父類沒有的情況---編譯未通過 //第三種:子類沒有的情況---結果是:10 結果是:10 public class Demo { public static void main(String[] args) { //多型的表現 父類的引用指向子類物件 Fu f= new Zi(); System.out.println("結果是:"+f.num); Zi z = new Zi(); System.out.println("結果是:"+z.num); } /* * 結論:當子父類中出現相同的成員變數時,多型呼叫該變數的時: * 編譯時期:參考的是引用型別變數所屬的類中是否有被呼叫的成員變數----如果沒有,則編譯失敗 * 執行時期:參考的是子類中的變數 * 簡單可記做:編譯看左邊,執行看右邊 */ }
1.3.2成員方法
//父類 class Fu{ void show(){ System.out.println("執行結果:父類"); } } //子類 class Zi extends Fu{ void show() { System.out.println("執行結果:子類"); } } //多型-----成員方法 //第一種:父類和子類中都有同名的方法----執行結果:子類 //第二種:父類沒有的情況---編譯時報錯 //第三種:子類沒有的情況---執行結果:父類 public class Demo { public static void main(String[] args) { //多型的表現 父類的引用指向子類物件 Fu f= new Zi(); f.show(); } /* * 結論:當子父類中出現相同的成員方法時,多型呼叫該變數的時: * 編譯時期:參考的是引用型別變數所屬的類中是否有被呼叫的成員變數----如果沒有,則編譯失敗 * 執行時期:參考引用物件所指的物件所屬的類,並執行物件所屬類中多的成員方法; * 簡單可記做:編譯看左邊,執行看右邊 */ }
1.4instanceof關鍵字
instanceof關鍵字的作用: 可以用來判斷某個物件是否屬於某種資料型別;
格式:Boolean flag = 物件 instanceof 資料型別class Person{};//人類 class Teacher extends Person{};//老師類 class Student extends Person{};//學生類 public class Demo4 { public static void main(String[] args) { Person p1 = new Student(); boolean flag1 = p1 instanceof Student; //true boolean flag2 = p1 instanceof Teacher; //false boolean flag3 = p1 instanceof Person; //true System.out.println(flag1+":"+flag2+":"+flag3); } }
1.5多型的轉型--向上轉型和向下轉型
多型的轉型分為兩種:
向上轉型:當有子類物件賦值給一個父類引用時,便是向上轉型,多型本身就是向上轉型的過程.
使用格式:父類型別 變數名 = new 子類型別(); 如 Person p = new Student();
向下轉型:一個已經向上轉型的子類物件可以使用強制型別轉換的格式,將父類引用轉換為子類引用,
使用格式:子類型別變數名 = (子類型別)父類型別的變數;如 Student stu = (Student)p;
注意:如果是直接創父類物件,則是無法向下轉型的;