java中子類重寫父類方法要注意的問題

2021-06-24 11:34:14 字數 1997 閱讀 6653

子類不能重寫父類的靜態方法,私有方法。即使你看到子類中存在貌似是重寫的父類的靜態方法或者私有方法,編譯是沒有問題的,但那其實是你重新又定義的方法,不是重寫。具體有關重寫父類方法的規則如下:

重寫規則之一:重寫方法不能比被重寫方法限制有更嚴格的訪問級別。

(但是可以更廣泛,比如父類方法是包訪問許可權,子類的重寫方法是public訪問許可權。)比如:object類有個tostring()方法,開始重寫這個方法的時候我們總容易忘記public修飾符,編譯器當然不會放過任何教訓我們的機會。出錯的原因就是:沒有加任何訪問修飾符的方法具有包訪問許可權,包訪問許可權比public當然要嚴格了,所以編譯器會報錯的。

重寫規則之二: 

引數列表必須與被重寫方法的相同。

重寫有個孿生的弟弟叫過載,也就是後面要出場的。如果子類方法的引數與父類對應的方法不同,那麼就是你認錯人了,那是過載,不是重寫。

重寫規則之三:

返回型別必須與被重寫方法的返回型別相同。

父類方法a:void eat(){} 子類方法b:int eat(){}兩者雖然引數相同,可是返回型別不同,所以不是重寫。

父類方法a:int eat(){} 子類方法b:long eat(){}返回型別雖然相容父類,但是不同就是不同,所以不是重寫。

重寫規則之四:

重寫方法不能拋出新的異常或者比被重寫方法宣告的檢查異常更廣的檢查異常。但是可以丟擲更少,更有限或者不丟擲異常。

注意:這種限制只是針對檢查異常,至於執行時異常runtimeexception及其子類不再這個限制之中。

重寫規則之五:

不能重寫被標識為final的方法。

重寫規則之六:

如果乙個方法不能被繼承,則不能重寫它。如private方法

比較典型的就是父類的private方法。下例會產生乙個有趣的現象。

public class test 

}class animal

}class horse extends animal

}

這段**是能通過編譯的。表面上看來違反了第六條規則,但實際上那是一點巧合。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(int a, int b)

}

重寫規則之八:子類不能用非靜態方法 重寫 父類的靜態方法

編繹報錯:thisinstance method cannot override the static mehtod froma

class a 

}public class test1 extends a

//this static method cannot hide the instance mehtod from a

//this instance method cannot override the static mehtod from a

public int method1(int a, int b)

}

java中子類重寫父類方法要注意的問題

重寫規則之一 重寫方法不能比被重寫方法限制有更嚴格的訪問級別。重寫規則之二 引數列表必須與被重寫方法的相同。重寫規則之三 返回型別必須與被重寫方法的返回型別相同。重寫規則之四 重寫方法不能拋出新的異常或者比被重寫方法宣告的檢查異常更廣的檢查異常。但是可以丟擲更少,更有限或者不丟擲異常。注意 這種限制...

關於Java中子類呼叫父類方法

當乙個類繼承於另乙個類,子類中沒有父類的方法時。用子類的物件呼叫方法時,會首先在子類中查詢,如果子類中沒有改方法,再到父類中查詢。當乙個方法只在父類中定義時,呼叫該方法時會使用父類中的屬性。如果該方法中又呼叫了其他方法,那麼還是按照之前的順序,先在子類中查詢,再在父類中查詢。package temp...

java中子類構造方法和父類構造方法

1.當子類不重寫構造方法,子類預設擁有乙個無參構造方法,但是,注意,這個構造方法第一行預設執行super class father class son extends father class demo 執行結果列印出 子類會呼叫father的構造方法 2.當子類重寫了自己的構造方法,構造方法預設第...