Java重写方法

时间:2015-04-17 12:27:39

标签: java inheritance

我在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会覆盖show()继承的方法class A。为什么b.show();不打印邮件System.out.println("SuperClass");,因为class B现在已经有来自show()的方法class A

谢谢。

4 个答案:

答案 0 :(得分:14)

B类的show方法会覆盖A类的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的show方法的逻辑。

答案 1 :(得分:3)

在课程B中,您将重写,换句话说,替换 show()方法的原始实现。每次在show()对象上调用instanceof B时,都会调用该方法的版本。

引用原始show()方法的唯一方法是使用super.show()内的B语法或任何其他扩展A的类来引用它。

另外需要注意的是,@Override注释只是为了添加额外的编译器检查,但实际上不需要覆盖方法,只需要像以前那样重新实现它。 B

答案 2 :(得分:3)

它是多态性的问题,即对方法体的方法调用在运行时发生,即当JVM调用B b = new B()时;所以B对象是B类的类型,所以它显示B方法的方法被覆盖一个,如果你把super()放在B()的构造函数中,你可以得到父母一个。

答案 3 :(得分: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
    }  
}