Java學習之多型

2021-06-26 19:28:42 字數 1765 閱讀 2289

原帖:

多型==晚繫結

不要把函式過載理解為多型。

因為多型是一種執行期的行為,不是編譯期的行為。

多型:父型別的引用可以指向子型別的物件。

比如 parent p = new child();

當使用多型方式呼叫方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;

如果有,再去呼叫子類的該同名方法。

(注意此處,靜態static方法屬於特殊情況,靜態方法只能繼承,不能重寫override,如果子類中定義了同名同形式的靜態方法,它對父類方法只起到隱藏的作用。呼叫的時候用誰的引用,則呼叫誰的版本。)

如果想要呼叫子類中有而父類中沒有的方法,需要進行強制型別轉換,如上面的例子中,將p轉換為子類child型別的引用。

因為當用父類的引用指向子類的物件,用父類引用呼叫方法時,找不到父類中不存在的方法。這時候需要進行向下的型別轉換,將父類引用轉換為子類引用。

結合例項說明

下面舉個例子(有問題的**已注釋):

主要講講兩種型別轉換和兩種編譯時候的錯誤。  

public

class

polytest

}class

animal

}class dog extends

animal

}class cat extends

animal

public

void

eat()

}

例子的執行結果:

這段**:

cat類中定義了eat()方法,但是animal類中沒有這個方法,a1引用是animal類的,所以找不到,編譯時出錯:

(1)向上型別轉換(upcast):將子型別轉換為父型別。

對於向上的型別轉換,不需要顯示指定,即不需要加上前面的小括號和父類型別名。

(2)向下型別轉換(downcast):將父型別轉換為子型別。

對於向下的型別轉換,必須要顯式指定,即必須要使用強制型別轉換。

並且父型別的引用必須指向子類的物件,即指向誰才能轉換成誰。

不然也會編譯出錯:

因為父類引用指向的是cat類的物件,而要強制轉換成dog類,這是不可能的。

多型學習的第二部分,抽象類和介面:

java學習之多型

向上轉型是不需要進行強制型別轉換的,但是向上轉型會丟失精度。與向上轉型對應的乙個概念就是 向下轉型 所謂向下轉型,也就是說父類的物件可以轉換為子類物件,但是需要注意的是,這時則必須要進行強制的型別轉換。類似於人壓彈簧 一 向上轉型可以自動完成 二 向下轉型必須進行強制型別轉換。可以用instance...

Java學習之多型

多型 晚繫結。不要把函式過載理解為多型。因為多型是一種執行期的行為,不是編譯期的行為。多型 父型別的引用可以指向子型別的物件。比如 parent p new child 當使用多型方式呼叫方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤 如果有,再去呼叫子類的該同名方法。注意此處,靜態sta...

Java學習之多型

多型 晚繫結。不要把函式過載理解為多型。因為多型是一種執行期的行為,不是編譯期的行為。多型 父型別的引用可以指向子型別的物件。比如 parent p new child 當使用多型方式呼叫方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤 如果有,再去呼叫子類的該同名方法。注意此處,靜態sta...