在網上看到一道面試題如下
public class Parent { public int addValue( int a, int b) { int s; s = a+b; return s; }}class Child extends Parent {}Which methods can be added into class Child? A. int addValue( int a, int b ){// do something…} B. public void addValue (){// do something…} C. public int addValue( int a ){// do something…} D. public int addValue( int a, int b )throws MyException {//do something…}
答案是B,C。
一開始還真有點迷糊,只明白考的是重寫與重載這個知識點。百度一下,結合自己的理解總結如下:
編譯器對方法的標識是靠方法名(方法的簽名)和參數列表來確定的。顯然我們就可以對在類中定義具有相同簽名的方法,只需使參數列表不同即可,這就是所謂的重載。重載只是創建了一個另一個方法而已,沒有什么特別的,唯一就是取了跟其他方法相同的名字而已。
重寫主要用于子類和父類之間,在父類中定義了一個方法,同時在子類中對這個方法進行重寫,實現子類行為的特殊化。這也是java實現多態性機制。java也定義了一些規則來約束重寫機制: (1)重寫方法必須和被重寫方法具有相同的參數列表,返回類型必須和被重寫方法的返回類型相同或者是返回類型的子類型。ps:這是必須的,不然就是方法重載了。。 (2)重寫方法的訪問控制修飾符不能比被重寫方法更嚴格(比如一個在父類中聲明為public的方法重寫成一個PRotected的方法)。 (3)只有實例方法才能被重寫,超類中的final方法不能被重寫。 (4)重寫方法不能拋出新的檢查異常,或者是拋出比被重寫方法聲明的檢查異常更廣泛的檢查異常。 (5)注意一種特殊情況:如果超類的方法版本中聲明了檢查異常,但重寫的子類方法中沒有聲明,這時如果使用多態的方式進行調用,那么編譯器認為你調用的是聲明了異常的方法。 (6)盡管多態是在編譯時確定對象的類型,但在編譯時,還是根據父類的方法聲明進行程序檢查。因此,如果子類中定義的方法,在父類中沒有定義,則會出項編譯錯誤。
新聞熱點
疑難解答