導航:首頁 > 方法技巧 > 子類覆蓋父類方法時如何報錯

子類覆蓋父類方法時如何報錯

發布時間:2023-01-21 14:28:07

Ⅰ java中覆蓋方法帶有拋出異常的情況

子類覆蓋父類方法拋出異常不能比父類多 這句話表述有些問題

正確應該是子類拋出的異常類型不能比父類拋出的異常類型更寬泛

通俗一點講就是:子類的異常類型不能比父類的異常類型更大或更多
例如父類方法拋出一個FileNotFoundException,這時候子類可以拋出FileNotException或者其子類,例如我自己寫了File1Exception,File2Exception,他們都繼承自FileNotException,這時候子類可以同時拋出File1Exception和File2Exception,因為他們都是FileNotFoundException,滿足「子類拋出的異常類型不能比父類拋出的異常類型更寬泛」這個條件 同時子類還可以拋出RuntimeExceptioin這是運行時異常,不受上面條件的約束!

什麼設計成這樣呢? 舉個現實的例子:我們現在有個動物類,它有個方法叫 eat() ,吃東西會拋出被毒死的異常,這是吃東西唯一可能出現的異常情況! 那麼我們的子類在重寫eat()方法時可以拋出 毒死異常或其子類,如"誤把老鼠葯當食物被毒死異常」、"吃有毒蘑菇被毒死異常「.....

但是子類就是不能拋出毒死異常之外的 如」撐死異常「或者」噎死異常「,因為父類是個大前提,指所有動物,animal總共才拋出毒死異常這個類型,你子類就不能拋出我類型之外的狀況!
例子舉的不太好,但是可以幫助理解。

Ⅱ 有關java中子類覆蓋父類的方法的返回值的問題

很簡單,在這個method裡面的時候,你寫name,系統不會自動匹配super.name而是自動匹配this.name,由於你這個name在this裡面沒有,所以系統就找不到了。你寫成super.name應該也能通過。

Ⅲ JAVA中子類重寫父類的方法,怎麼寫,什麼要求

1.父類的方法不能降級,同級的話就要覆蓋,例如public方法不能在子類中被聲明為protected或者private(子類重載除外),否則會有

Cannot rece the visibility of the inherited method from Father的編譯錯誤。

2.父類的方法可以任意升級,但升級只有兩種方式,要麼覆蓋,要麼重載,覆蓋就是方法體完全一樣,重載則是參數必須改變,方法名稱不變。


importjava.lang.reflect.Method;

classFather{
inta;
protectedintb=5;
protectedvoidfuncpro(){
//父類的保護方法,子類能夠訪問,但子類自身沒有
System.out.println("fatherfuncpro");
}
publicvoidfuncpub(){
//父類公有方法,子類直接繼承
}
privatevoidfuncpri(){
//父類私有方法,子類不可見
}
}
{

/**
*@paramargs
*/
//父類保護方法的重寫
//publicvoidfuncpro(){
////子類自己可以這樣定義,將會覆蓋父類protected方法
//System.out.println("子類的func方法");
//}

//protectedvoidfuncpro(){
////ok
//}

//publicshortfuncpro(){
////illegal父類的protected和public方法在子類中是可見的,試想一下,如果編譯器認為這個方法體正確,
//那麼子類調用funcpro的時候究竟調用哪個呢?這樣沒有能構成重載
//}

//privatevoidfuncpro(){
////illegal
//}

privatevoidfuncpro(inta){
//這是方法重載,不會報錯
System.out.println("sunfuncpro");
}

//父類公有方法的重寫

//privatevoidfuncpub(){
////illegal:
//}

//protectedvoidfuncpub(){
////illegal
//}

//publicvoidfuncpub(){
////ok
//}

//publicintfuncpub(){
////illegal和父類的返回值不匹配
//}

//publicintfuncpub(inti){
////ok子類構成重載
//return1;
//}

//父類私有方法的重寫

//publicvoidfuncpri(){
////ok
//}

//protectedvoidfuncpri(){
////ok
//}

//privatevoidfuncpri(){
////ok
//}

publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
TestOveridetestOveride=newTestOveride();
Classclass1=testOveride.getClass();
try{
Method[]methods=class1.getMethods();
System.out.println("子類中的所有方法:");//可以看到,並沒有父類的funcpro方法
for(Methodm:methods){
System.out.println(m);
}
System.out.println("子類調用父類的protected方法:");
testOveride.funcpro();
System.out.println("子類調用自己的func方法:");
testOveride.funcpro(1);
System.out.println("子類調用父類的欄位");
System.out.println(testOveride.b);
}catch(Exceptione){
e.printStackTrace();
}

}

}

Ⅳ java 父類方法名稱為private,則子類無法覆寫,也不會這樣去編寫代碼

我覺得這樣寫是可以的。但是!!!!這樣寫出來的print()方法就不叫「覆寫父類方法"了,它會當你是在子類里邊重新定義了一個名為print的方法。
如果你覺得這樣對父類方法覆寫時不保險,建議你在覆寫方法前加上」@Override「,這樣如果你想覆寫,按照你上邊寫的,編譯器就不會通過編譯,也就不會出現上邊所說的」它會當你是在子類里邊重新定義了一個名為print的方法「問題,這是最保險的做法。我認為。

Ⅳ 被覆蓋的方法無法拋出異常

javainlife 的代碼為什麼能列印出a,那是因為其拋出的異常是RuntimeException,所以在b.java中

public void a() throws RuntimeException
public void a()
兩中寫法是等價的

覆蓋有個原則
子類覆蓋父類的方法,那麼子類方法聲明拋出的異常必須是父類方法聲明拋出的異常的本身或者其子類

比如說父類上面拋出Exception

那麼子類方法聲明可以拋出Exception 或者Exception的子類異常

下面的代碼可以看看:
class MyException extends RuntimeException{

}
interface a{
public void aa();
}
class b implements a{
public void aa()throws MyException{

}
}
編譯沒問題

Ⅵ java覆蓋問題。覆蓋父類方法拋出異常問題

重寫方法需要拋出與原方法所拋出異常類型一致異常或不拋出異常。
一個方法是否顯示拋出異常對於重寫是沒用影響的,只是對調用者有影響,對於使用者來說如果你拋出的是一個未報告的異常那他就要必須使用trycatch來捕獲異常了。而且你要注意如果說你顯示拋出一個UnsupportedOperationException之類的異常,調用該方法可以不用自己來親自捕獲異常的,可以直接再往上次拋。RuntimeException異常類以及其子類都屬於此范疇,調用者可以不用自己去捕獲異常的!

子類拋出的異常類型不能比父類拋出的異常類型更寬泛!
對於這句話你還少了一個條件應該是子類重寫父類方法不能拋出比父類更寬的異常類型的把。其實理解這個很簡單,比如說憲法規定罵人只承擔民事責任,到了刑法里就不能說直接槍斃了,這就是一個約束能力的問題,子類行為不能超出父類約束范疇。否者就容易亂套。就像父類的某方法公有的,子類就不能重寫改成私有的了。這就是一個約束力的問題。

還有我查到說拋出runtime異常沒有問題。運行時異常雖然可以不用捕獲。但如果其本身已經超出了父類的范圍呢?
這個還是拿憲法民事責任來說把,憲法說罵人教育一下就可以了,到了省里說道個歉就可以了,但是到了市裡了,不光道歉還要寫檢討。這些都是可以的,因為他們本身就有處理這個事件的能力。子類方法他可以不管RuntimeException之類的異常,這是前提,就算你父類方法聲明的異常更小,我可以行使我拋出RuntimeException異常的權利,這個是我的本身就有的權利。這就像是地方政策和國家政策相抵觸的時候,老百姓可以直接往國家報告,可以不經過地方政府一樣,因為老百姓有直接上報國家的權利。子類有RuntimeException異常不報告的權利,就算你父類規定個更低的異常,我一樣可以上報,只要你比RuntimeException低級就可以。
這就好比,賣國賊選擇了賣國,他們的子女就不能愛國了一樣!

Ⅶ java子類覆蓋(override)父類的方法, 異常如何處理

子類在覆蓋父類帶throws子句的方法時,子類的方法聲明中的throws子句拋出的異常不能超出父類方法的異常范圍,因此,throws子句可以限制子類的行為。換句話說,子類的方法拋出的異常只能和父類方法一致,或者是不拋出異常,但是不能出現父類對應方法的throws子句中沒有的異常類型

Ⅷ c# 子類覆蓋父類方法

# 對方法的重載必須要顯式聲明,這個與 C++ 和 JAVA 都不同。見下面的 C# 程序:

classPlane

{

publicdoubleTopSpeed()

{

return300.0D;

}

}

classJet:Plane

{

publicdoubleTopSpeed()

{

return900.0D;

}

}

classAirport:IEntryPoint

{

publicvoidMain()

{

Planeplane=newJet();

Console.WriteLine("planestopspeed:{0}",plane.TopSpeed());

}

}

上面的程序很簡單,在編譯時會有警告:警告:「Jet.TopSpeed()隱藏了繼承的成員Plane.TopSpeed()。如果是有意隱藏,請使用關鍵字 new。"E:.cs9217LearningCSharpByExample
但結果卻出乎意料地是:

planes top speed: 300

很顯然,它並沒有調用子類的 TopSpeed 方法。原因是在 C# 中,方法如果想要被重載,必須顯式地聲明為 virtual,也就是虛方法。而繼承類如果要重寫此方法時,也必須顯式地聲明為 override ,這樣才能覆蓋父類方法。C# 代碼如下:

classPlane

{

publicvirtualdoubleTopSpeed()

{

return300.0D;

}

}

classJet:Plane

{

publicoverridedoubleTopSpeed()

{

return900.0D;

}

}

classAirport:IEntryPoint

{

publicvoidMain()

{

Planeplane=newJet();

Console.WriteLine("planestopspeed:{0}",plane.TopSpeed());

}

}

以上程序的輸出結果是:

planes top speed: 900

在 C# 中,如果一個方法允許子類覆蓋,則必須要顯式聲明為 virtual 的(在 JAVA 中,默認是 virtual 的),並且在子類里必須顯式聲明為 override。這兩個關鍵子哪個也不能省。順便再說一下另外的三個關鍵字:sealed、abstract、new。

在繼承 abstract 類的 abstract 方法時,也必須聲明方法為 override,abstract 方法的特性與 JAVA 中的抽象類是一樣的。sealed 關鍵字意思是密封的,相當於 JAVA 中的 final,在類上使用是不可再被繼承,在方法上使用是不可再覆蓋;但還有一個例外,就是對方法使用 new 關鍵字聲明。代碼如下:

abstractclassPlane
{
publicvirtualdoubleTopSpeed()
{
return300.0D;
}
}
classJet:Plane
{
()
{
return900.0D;
}
}
classUFO:Jet
{
publicnewdoubleTopSpeed()
{
return13000.0D;
}
}
classAirport:IEntryPoint
{
publicvoidEntryPoint()
{
UFOplane=newUFO();
Console.WriteLine("planestopspeed:{0}",((Plane)plane).TopSpeed());
Console.WriteLine("planestopspeed:{0}",((Jet)plane).TopSpeed());
Console.WriteLine("planestopspeed:{0}",((UFO)plane).TopSpeed());
}
}

注意,我是把 UFO 對象強轉成某一對象然後調用其 TopSpeed 方法的,上面程序的輸出結果是:

planes top speed: 900
planes top speed: 900
planes top speed: 13000

總之:C# 在這方面增加了方法定義的靈活性,給用戶的更大的權利。但用不好會出現比較奇怪的結果。所以我覺得在定義方法時全部都加上 sealed 或是 virtual 關鍵字,這樣避免繼承的類出錯.

閱讀全文

與子類覆蓋父類方法時如何報錯相關的資料

熱點內容
ps中如何用通道的方法 瀏覽:3
478加499簡便方法計算 瀏覽:196
電腦打不了機維修方法 瀏覽:150
發動機艙的鑒別方法 瀏覽:917
有什麼催尿的方法 瀏覽:177
如何洗腳養腎的方法 瀏覽:573
勝利兆歐表使用方法 瀏覽:139
硃砂使用方法 瀏覽:956
緩解牙疼的最快方法按摩哪裡 瀏覽:53
游完泳耳朵悶堵快速解決方法 瀏覽:942
廚房中鑒別白醋顯酸性的三種方法 瀏覽:968
折紙飛機折得最遠的簡便方法 瀏覽:69
尿酸鹼度檢測標准方法 瀏覽:830
浴室熱水管道安裝方法 瀏覽:280
手機網路黑屏解決方法 瀏覽:211
花卉土培檢測方法 瀏覽:280
獲取檢測信息的方法有哪些 瀏覽:122
蛋糕比容的計算方法 瀏覽:740
破壞動物細胞膜最常用的方法 瀏覽:248
社會作業研究方法 瀏覽:545