2015-04-17 104 views
2

我在Java重寫中有點混亂。假設我們有以下繼承:Java重寫方法

class A{ 
    public A(){  
    } 

    void show(){ 
     System.out.println("SuperClass"); 
    } 
} 

class B extends A{ 

    @Override 
    void show(){ 
     System.out.println("SubClass"); 
    } 

} 

public class Test { 

    public static void main(String[] args) { 
     B b = new B(); 
     b.show(); 
    } 
} 

顯然,class B覆蓋了由該class A繼承的方法show()。爲什麼不b.show();打印信息System.out.println("SuperClass");以及因爲class B現在有方法show()class A

謝謝。

+6

如果是的話,重寫方法會有什麼意義? –

+1

@ sp00m那種。該方法仍然存在,但您可以通過'super'訪問它。 – aruisdante

+0

你好邁克與繼承關係,其多態行爲,即方法體的方法調用發生在運行時,即當jvm調用B b = new B();所以B對象是類B的類型,所以它顯示B的方法的方法被覆蓋1,如果你把super()你可以得到一個父類。 – Kogile

回答

14

B類的show方法覆蓋A級的表演方法,並且不會調用它,所以沒有理由System.out.println("SuperClass");當你調用show上B.

的實例,如果你改變要被執行類B到:

class B extends A 
{ 
    @Override 
    void show(){ 
     super.show(); 
     System.out.println("SubClass"); 
    } 
} 

調用B的一個實例show也將執行A的展示方法的邏輯。

+1

它應該調用super.show();不只是super(); – benzonico

+1

@benzonico我的錯誤。它應該是'super.show()'。 'super()'用於調用超類的構造函數。感謝您的評論。 – Eran

+0

'super()'不能在方法中使用,除非構造函數。 –

3

在類B中你是壓倒一切的,換句話說代替原來實施的show()方法。每當您調用show()的對象是instanceof B該方法的版本將被調用。

參考原始show()方法的唯一方法是使用B中的super.show()語法或其他任何延伸爲A的類來引用它。

並且作爲附加說明,該註釋僅用於添加其他編譯器檢查,但不需要實際覆蓋某個方法,您只需要按照B中的方法重新實現它即可。

3

它的多態性行爲,即對方法體的方法調用發生在運行時,即當JVM調用B b = new B();所以B對象是類B的類型,所以如果你在B()的構造函數中加入super(),你可以得到父類的方法,所以它顯示B的方法被覆蓋。

2

這是重寫繼承的效果。你只需從超類中取代方法(但你仍然可以到達舊方法!)在這裏我也添加了一點多態性。希望這會幫助你。

class A{ 
    public A(){  
    } 

    void show(){ 
     System.out.println("SuperClass"); 
    } 
} 

class B extends A{ 

    void superclass() { 
     super.show(); 
    } 

    @Override 
    void show(){ 
     System.out.println("SubClass"); 
    } 

} 

public class Test { 

    public static void main(String[] args) { 
     B b = new B(); 
     b.show(); //SubClass 
     b.superclass(); //SuperClass 

     A a = new A(); 
     a.show(); //SuperClass 

     A c = new B(); 
     c.show(); //SubClass 
     //c.superclass(); //error! the program won't compile 
    } 
} 
+1

使它成爲//c.superclass();錯誤!該程序不會編譯 – Palak

+0

好的,完成。謝謝! –