Java 方法重写 - 使用参数时调用父方法

标签 java polymorphism overriding

这是我编写的代码:

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 而不是使用父类方法。

最佳答案

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

在您的情况下,类 A 有一个方法 b(Number x) 和类 B 扩展 A有一个方法 b(Integer x) ==> B.b() 在执行 时不会覆盖 A.b() ==> ((A) b).b(b), A.b(3) 被执行。

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

方法的返回值在重写时并不重要,只有名称和参数。

关于Java 方法重写 - 使用参数时调用父方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44361712/

相关文章:

java - JPA CriteriaBuilder 如何创建 join + like 查询

java - 实例化通用对象

c - 在C中实现2个具有相同类型和名称但参数不同的函数

model-view-controller - 如何重写ResourceHttpRequestHandler来实现自定义的资源处理程序?

swift 。让我们重写但不调用该方法

java - J2SE 代理认证

java - @After 的 AOP 切入点

java - 为什么它总是给我一个系统包错误?

c++ - 如何以多态方式初始化 `static` 成员

java - 重写对象类的compareTo方法