Note(8): 繼承——重寫

重寫(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

 

這裏的結果,我想大家都應該能理解了。

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