2015-04-17 105 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

好的,完成。谢谢! –