參考:
若想實現乙個合格重寫方法,而不是過載,那麼必須同時滿足下面的要求!
重寫規則之一:重寫方法不能比被重寫方法限制有更嚴格的訪問級別。
(但是可以更廣泛,比如父類方法是包訪問許可權,子類的重寫方法是public訪問許可權。)比如:object類有個tostring()方法,開始重寫這個方法的時候我們總容易忘記public修飾符,編譯器當然不會放過任何教訓我們的機會。出錯的原因就是:沒有加任何訪問修飾符的方法具有包訪問許可權,包訪問許可權比public當然要嚴格了,所以編譯器會報錯的。
重寫規則之二: 引數列表必須與被重寫方法的相同。
重寫有個孿生的弟弟叫過載,也就是後面要出場的。如果子類方法的引數與父類對應的方法不同,那麼就是你認錯人了,那是過載,不是重寫。
重寫規則之三:返回型別必須與被重寫方法的返回型別相同。
父類方法a:void eat(){} 子類方法b:int eat(){}兩者雖然引數相同,可是返回型別不同,所以不是重寫。
父類方法a:int eat(){} 子類方法b:long eat(){}返回型別雖然相容父類,但是不同就是不同,所以不是重寫。
重寫規則之四:重寫方法不能拋出新的異常或者比被重寫方法宣告的檢查異常更廣的檢查異常。但是可以丟擲更少,更有限或者不丟擲異常。
注意:這種限制只是針對檢查異常,至於執行時異常runtimeexception及其子類不再這個限制之中。
重寫規則之五:
不能重寫被標識為final的方法。
重寫規則之六:如果乙個方法不能被繼承,則不能重寫它。如private方法
比較典型的就是父類的private方法。下例會產生乙個有趣的現象。
//父類
class animal }
//子類
class horse extends animal
}//測試類
public class test }
這段**是能通過編譯的。表面上看來違反了第六條規則,但實際上那是一點巧合。animal類的eat()方法不能被繼承,因此horse類中的eat()方法是乙個全新的方法,不是重寫也不是過載,只是乙個只屬於horse類的全新的方法!這點讓很多人迷惑了,但是也不是那麼難以理解。
main()方法如果是這樣:
animal h = new horse();
//horse h = new horse();
h.eat();
編譯器會報錯,為什麼呢?horse類的eat()方法是public的啊!應該可以呼叫啊!請牢記,多型只看父類引用的方法,而不看子類物件的方法!
重寫規則之七:子類不能用 靜態方法 重寫父類的非靜態方法
編繹無法通過this static method cannot hide the instance mehtodfrom
class a }
public class test1 extends a
//this static method cannot hide the instance mehtod from a
static public int method1(inta, int b) }
重寫規則之八:子類不能用非靜態方法 重寫 父類的靜態方法
java中子類重寫父類方法要注意的問題
子類不能重寫父類的靜態方法,私有方法。即使你看到子類中存在貌似是重寫的父類的靜態方法或者私有方法,編譯是沒有問題的,但那其實是你重新又定義的方法,不是重寫。具體有關重寫父類方法的規則如下 重寫規則之一 重寫方法不能比被重寫方法限制有更嚴格的訪問級別。但是可以更廣泛,比如父類方法是包訪問許可權,子類的...
java中子類重寫父類方法要注意的問題
重寫規則之一 重寫方法不能比被重寫方法限制有更嚴格的訪問級別。重寫規則之二 引數列表必須與被重寫方法的相同。重寫規則之三 返回型別必須與被重寫方法的返回型別相同。重寫規則之四 重寫方法不能拋出新的異常或者比被重寫方法宣告的檢查異常更廣的檢查異常。但是可以丟擲更少,更有限或者不丟擲異常。注意 這種限制...
子類繼承父類重寫父類的屬性值問題
試想一下 的執行結果 package com.syc.test public class a class fatherclass class sonclass extends fatherclass 程式的執行結果是 你想對了嗎?我們稍微做乙個改變,繼續試想一下 的執行結果 package com....