重寫(Override):override也可以翻譯爲覆蓋,從字面就可以知道,它是覆蓋了一個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的重寫就是對接口方法的實現,在接口中一般只是對方法進行了聲明,而我們在實現時,就需要實現接口聲明的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類重寫父類中的方法。
重寫的標準:
1、重寫的方法的標誌必須要和被重寫的方法的標誌完全匹配,才能達到重寫的效果;
2、重寫的方法的返回值必須和被重寫的方法的返回一致;
3、重寫的方法所拋出的異常必須和被重寫方法的所拋出的異常一致,或者是其子類;
4、被重寫的方法不能爲private,否則在其子類中只是新定義了一個方法,並沒有對其進行重寫。
重載(Overload):overload對我們來說可能比較熟悉,可以翻譯爲重載,它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入參數來區分這些方法,然後再調用時,VM就會根據不同的參數樣式,來選擇合適的方法執行。
重載的標準:
1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如fun(int, int)就沒有參數順序可言了);
2、不能通過訪問權限、返回類型、拋出的異常進行重載;
3、方法的異常類型和數目不會對重載造成影響;
以上的概念我向大家都很熟悉了,今天要討論的問題主要是和重寫有關。
下面是實例代碼:
父類:
public class Parent {
public void p1(){
System.out.println("Parent print P1");
this.p2();
}
public void p2(){
System.out.println("Parent print p2");
}
public void p3(){
System.out.println("Parent print p3");
}
}
接着是子類:
public class Child extends Parent{
public void c1(){
System.out.println("Child print c1");
}
public void c2(){
System.out.println("Child print c2");
}
public void p2(){
System.out.println("Child print p2");
}
}
最後是測試類:
public class Test {
public static void main(String[] args) {
Child c=new Child();
c.p1();
}
}
運行測試類後,輸出的結果如下:
Parent print P1
Child print p2
而不是
Parent print P1
Parent print p2
用一個很簡單的方法理解的話,當Child繼承Parent,並且重寫了p2()方法,Child類可以看成如下的形式:
public class Child extends Parent{
public void c1(){
System.out.println("Child print c1");
}
public void c2(){
System.out.println("Child print c2");
}
//重寫的方法p2();
public void p2(){
System.out.println("Child print p2");
}
//繼承的方法p1();
public void p1(){
System.out.println("Parent print P1");
this.p2();
}
//繼承的方法p3();
public void p3(){
System.out.println("Parent print p3");
}
}
這樣就比較方便的理解上面輸出的結果了。
爲了測試,我們可以這樣改寫Child類:
public class Child extends Parent{
public void c1(){
//在c1()方法中調用p3()方法,雖然p3()方法沒有顯式的在Child類中寫出,
//但如上所述,它是真實存在於Child方法中的,所以,這裏是不會報錯的;
p3();
System.out.println("Child print c1");
}
public void c2(){
System.out.println("Child print c2");
}
public void p2(){
System.out.println("Child print p2");
}
}
重新改寫測試類:
public class Test {
public static void main(String[] args) {
Child c=new Child();
c.c1();
}
}
輸出結果爲:
Parent print p3
Child print c1
這裏的結果,我想大家都應該能理解了。