原帖:
多型==晚繫結。
不要把函式過載理解為多型。
因為多型是一種執行期的行為,不是編譯期的行為。
多型:父型別的引用可以指向子型別的物件。
比如 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...