Java方法覆盖 - 使用参数时调用父方法

时间:2017-06-05 04:32:52

标签: java polymorphism override

这是我写的代码:

https://pastebin.com/raw/0iBrGJR4

最相关的部分:

    A a = new A();
    B b = new B();    

    System.out.println(((A) b).a());    
    System.out.println(((A) b).b(3));    


  static class A {
    Object a() {
      System.out.println("A.a()");
    }

    Object b(Number x) {
      System.out.println("A.b()");    
    }
  }


  static class B extends A {
    String a() {
      System.out.println("B.a()");
      return "hello";
    }

    String b(Integer x) {
      System.out.println("B.b()");
      return "hola" + x;
    }
  }

当我运行时,第一个打印显示

B.a()
hello

这是我的预期,因为即使我们转向A,呼叫也会进入对象的实际类型,即B。

但第二次打印,((A)b).b(3)调用,打印

A.b()
3

(即它调用A中的方法)。强制转换3到Integer也没有做任何事情。有人可以向我解释这种行为吗?我不明白原因是什么。我希望((A)b).b(3)打印B.() \n hola3而不是使用父类方法。

1 个答案:

答案 0 :(得分:2)

在Java中,一个方法覆盖父类中另一个方法的原因是它是否具有相同的名称,但参数的数量和/或类型不同。

在您的案例中,课程A的方法b(Number x)和课程B扩展A方法b(Integer x) ==> B.b()不会覆盖A.b() ==>执行((A) b).b(b)时,会执行A.b(3)

相反,B.a() 会覆盖 A.a() ==>执行((A) b).a()时,会执行B.a()

方法的返回值在覆盖时无关紧要,只有名称和参数。