JAVA爲什麼子類繼承父類方法之後,不能拋出比父類更多的異常?

        今天看視頻的時候,方立勳老師說到這個問題,他舉出一個例子,說父親有一個錯誤的方法,導致自己可能犯錯,可能殺人放火。兒子繼承了父親這個方法,那麼兒子肯定不能比父親更壞,不能夠在殺人放火的基礎上還調戲婦女。

      

         聽到這個問題之後,我就覺得不對勁。即便是模擬現實,兒子不能比父親更加差勁這種東西也太違背自然規律了,因爲社會上存在着很多比父親差勁的兒子。而且並不是每一個搶劫犯都是搶劫犯的兒子。也並不是每一個不搶劫的人,生不出搶劫犯兒子。

     

        後來自己就這個問題思考了下。

         得出以下的結論,當然,該結論雖然讓我覺得比較正確,也不能確定其真僞。

   

         子類在覆蓋父類方法的時候,父類的引用是可以調用該方法的,如果父類的引用調用子類的方法,那麼這個多拋出來的異常,就可能處於一種無法被處理的狀態。下面,我就通過代碼進行一下演示:


       我們先定義一個Animal類:

    

class Animal
{
	public void eat()throws IOException,FileNotFoundException
	{
		System.out.println("eat");
	}
}

  接着,我們再定義一個Tiger類繼承該Animal類


class Tiger extends Animal
{
	public void eat()throws IOException ,Exception
	{
		System.out.println("Tiger eat animal");
	}
}

這樣,tiger的eat方法裏,就有一個Exception 異常,這個異常的級別高於IO。也就是說對IO異常的處理,無法處理Exception 異常。

這個時候,如果我們定義一個測試方法,測試動物吃東西這個方法。

如下:

class Test
{
    public void TestAnimalEat(Animal a) 
    {
        try
        {
            a.eat();
        }
        catch(FileNotFoundException e1)
        {
            e1.printStackTrace();
        }
        catch(IOException e2)
        {
            e2.printStackTrace();
        }
        
    }
}

那麼,這個方法是完全正確的,因爲他處理了eat方法的兩個異常。一個拋出,一個捕獲。

這個時候,如果我們再進行如下的操作:

class TestDemo
{
	public static void main(String[] args) 
	{
		Test t = new Test();
		Tiger tiger = new Tiger();
		t.TestAnimalEat(tiger);
	}
}

則在調用tiger對象的時候,Test中的TestAnimalEat()方法只處理Animal類的eat()方法的兩個異常,而這個Tiger類中的eat()方法多出來的Exception,就無法進行處理。所以,JAVA就不允許做這種子類拋出比父類更多的異常。


當然,這裏說更多是不合適的,子類不能拋出父類異常本身和其子異常以外的其他異常。比如,如果父類拋出一個Exception 異常,那麼子類就可以隨心所欲的拋出很多的異常了。因爲這些異常都是父類異常的子異常。

        

 

那麼如果要聯繫現實,應該如何說呢。

        一個修理家電的人,他能夠修理冰箱,電腦,洗衣機,電視機。 一個年輕人從他這裏學的技術,就只能修理這些家電,或者更少。你不能要求他教出來的徒弟用從他這裏學的技術去修理直升飛機。


      這個說法和老師說法其實也比較一致,但是徒弟這個說法可能比兒子這個說法,更加容易理解吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章