Java 面向對象-多態 ①

在繼承關係中,子類如果定義了一個與父類方法簽名完全相同的方法,被稱爲重寫(Override)。

例如,在Person類中,我們定義了run()方法:

class Person {
    public void run() {
        System.out.println("Person.run");
    }
}

在子類Student中,覆寫這個run()方法:

class Student extends Person {
    @Override
    public void run() {
        System.out.println("Student.run");
    }
}

Override和Overload不同的是,如果方法簽名如果不同,就是Overload,Overload方法是一個新方法;

如果方法簽名相同,並且返回值也相同,就是Override

 注意:方法名相同,方法參數相同,但方法返回值不同,也是不同的方法。在Java程序中,出現這種情況,編譯器會報錯。 

如果子類覆寫了父類的方法,那麼,一個實際類型爲Student,引用類型爲Person的變量,調用其run()方法,調用的是Person還是Studentrun()方法?

public class Main {
    public static void main(String[] args) {
        Person p = new Student();
        p.run(); // 應該打印Person.run還是Student.run?
    }
}

class Person {
    public void run() {
        System.out.println("Person.run");
    }
}

class Student extends Person {
    @Override
    public void run() {
        System.out.println("Student.run");
    }
}

Java的實例方法調用是基於運行時的實際類型的動態調用,而非變量的聲明類型。

這個非常重要的特性在面向對象編程中稱之爲多態。它的英文拼寫非常複雜:Polymorphic。

多態

多態是指,針對某個類型的方法調用,其真正執行的方法取決於運行時期實際類型的方法。

Person p = new Student();
p.run(); // 無法確定運行時究竟調用哪個run()方法

Java 面向對象-多態 ①

Java 面向對象-多態 ②

Java 面向對象-多態 ③

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章