關於Java的多態性

多態性有兩種:

關於Java的多態性

1)編譯時多態性

對於多個同名方法,如果在編譯時能夠確定執行同名方法中的哪一個,則稱爲編譯時多態性.

2)運行時多態性

如果在編譯時不能確定,只能在運行時才能確定執行多個同名方法中的`哪一個,則稱爲運行時多態性.

方法覆蓋表現出兩種多態性,當對象獲得本類實例時,爲編譯時多態性,否則爲運行時多態性,例如:

XXXX x1 = new XXXX(參數列表); //對象獲得本類實例,對象與其引用的實例類型一致

XXX xx1 = new XXX(參數列表);

ring(); //編譯時多態性,執行XXX類的方法.

ring(); //編譯時多態性,執行XXXX類覆蓋的方法.

XXXX爲XXX的父類.

由於子類對象既是父類對象,父類對象與子類對象之間具有賦值相容性,父類對象能夠被賦值爲子類對象.例如,

XXXX x2 = new XXX(參數列表); //父類對象獲得子類實例,子類對象即是父類對象

ring(); //運行時多態

x2聲明爲父類對象卻獲得子類XXX的實例,那麼ring()究竟執行父類方法還是執行子類覆蓋的方法呢?

這分爲兩種情況:

取決於子類是否覆蓋父類方法.如果子類覆蓋父類方法,則執行子類方法;

如果沒有覆蓋,則執行父類方法.

在編譯時,僅僅依據對象所屬的類,系統無法確定到底應該執行那個類的方法,只有運行時才能確定,因此這是運行時多態.

父類對象並不能執行所有的子類方法,只能執行那些父類中聲明子類覆蓋的子類方法.