Java學習筆記11(物件導向四:多態),java學習筆記
多態:
舉例:描述一個事物的多種形態,如Student類繼承了Person類,一個Student對象既是Student,又是Person
多態體現為:父類引用變數可以指向子類對象
多態的前提:必須有子父類別關係或者類實現介面關係,否則無法完成多態
在使用多態後的父類引用變數調用方法時,會調用子類重寫後的方法
舉例:
public class Fu { public void show(){ System.out.println("父類的show方法"); }}
public class Zi extends Fu{ public void show(){ System.out.println("子類重寫父類的show方法"); }}
public class Test { public static void main(String[] args) { //利用多態性 //公式:父類類型(介面類型)變數 = new 子類的對象 Fu f = new Zi(); f.show(); }}//輸出:子類重寫父類的show方法
抽象類別多態:
public abstract class Person { public abstract void work();}
public class Teacher extends Person { public void work() { System.out.println("Teacher在工作"); }}
public class Test { public static void main(String[] args) { //抽象類別多態 Person p = new Teacher(); p.work(); }}//輸出:Teacher在工作
介面多態:
public interface Work { public abstract void work();}
public class Student implements Work{ public void work(){ System.out.println("Student在工作"); }}
public class Test { public static void main(String[] args) { //介面多態 Work w = new Student(); w.work(); }}//輸出:Student在工作
多態中成員方法的特點:
public class Fu { int a = 1; }
public class Zi extends Fu{ int a = 2;}
public class Test { public static void main(String[] args) { Fu f = new Zi(); System.out.println(f.a); }}//輸出:1
成員變數:
編譯的時候,參考父類中有沒有這個變數,如果有,編譯成功,如果沒有,編譯失敗
啟動並執行時候,啟動並執行是父類中的變數值
總結:編譯運行全看父類
成員方法:
父類中沒有聲明或者定義的方法無法調用,
子類如果重寫,調用的是子類方法,子類沒有重寫,調用父類方法
總結:編譯看父類,運行看子類
instanceof關鍵字:
用於比較引用資料類型:
public class Test { public static void main(String[] args) { //Person p = new Student(); Person p = new Teacher(); boolean b = p instanceof Student; System.out.println(b); }}//輸出:false
多態轉型:
向上轉型:
java是一種強制資料類型的語言,參與運算的資料,需要保證類型的統一
如Person p = new Student();
兩個資料類型是不同的,但是成功運行
因為這裡出現了自動型別提升,將取值範圍小的自動提升為取值範圍大的
範圍小的,看成是子類,範圍大的,看成是父類
這裡子類提升到了父類的類型
優點:可以調用子類和父類的共有內容
缺點:無法調用子類的特有內容
如果想調用子類的特有內容:
向下轉型(類似以前提到的強制轉型):
Student s = (Student)p;
由父類類型強制轉回子類的類型
好處:可以調用子類特有的功能
轉型的案例:
public abstract class Animal { public abstract void eat();}
public class Cat extends Animal { public void eat(){ System.out.println("貓在吃"); } public void catchMouse(){ System.out.println("貓在抓老鼠"); } }
public class Dog extends Animal { public void eat(){ System.out.println("狗在吃"); } public void lookHome(){ System.out.println("狗在看家"); }}
public class Test { public static void main(String[] args) { Animal a1 = new Cat(); Animal a2 = new Dog(); a1.eat(); a2.eat(); //向下轉型,調用子類的特有方法 //使用if .instanceof. 為了確保安全性 if(a1 instanceof Cat){ Cat c = (Cat)a1; c.catchMouse(); } if(a2 instanceof Dog){ Dog d = (Dog)a2; d.lookHome(); } }}/*輸出: * 貓在吃 * 狗在吃 * 貓在抓老鼠 * 狗在看家 */