首页 > 解决方案 > 多态实例如何选择它的方法?

问题描述

我无法理解这段代码的行为。a 定义为 A,c 定义为 C。然后,在公共类的末尾,a = c。当 a 调用 display() 方法时,它会到达它的 C 版本。但是,当 a 调用 f() 时,它只能到达 A 版本,尽管第一个参数(字节和 long)比 float 更符合 long。

这是一本书的练习,但解释很少,或者根本不存在。

class A{
    public void display(){
        System.out.println("I am an A ");
    }

    public void f(double x){
        System.out.println("A.f(double = " + x + ") ");
    }
}

class C extends A{
    public void display(){
        System.out.println("I am a C ");}

    public void f(long q){
        System.out.println("C.f(long = " + q + ") ");}
    }


public class PolySurStack{
    public static void main(String Args[]){
        byte bb =1; long q = 4; float x = 5.f;

        System.out.println(" ** A **");
        A a = new A(); a.display();
        a.f(bb); a.f(x);

        System.out.println();
        System.out.println(" ** C **");
        C c = new C(); c.display();
        c.f(bb); c.f(q); c.f(x);
        System.out.println();
        a = c; a.display();
        a.f(bb); a.f(q); a.f(x);
    }
} 

标签: javapolymorphismoverridingoverloading

解决方案


我刚刚在另一个论坛上发现了这个:

重载:(相同的函数名称但不同的签名)

  1. 在同一类中具有相同名称但参数不同的两个或多个方法称为重载。

  2. 当您想要扩展功能时使用重载。

  3. 重载被称为编译时多态性

覆盖:(相同的函数名称但相同的签名)

  1. 在父类和子类中具有相同方法名称和相同参数的两个或多个方法称为覆盖。

  2. 当您想要重用现有功能时,使用覆盖。

  3. 覆盖被称为运行时多态性

所以我的问题的答案似乎是覆盖分辨率(如 display() )发生在运行时(在 a = c 之后),而重载分辨率(如 f() )发生在编译时,此时 a 仍然是一个。

我认为。

我还找到了这个页面:https ://beginnersbook.com/2013/04/runtime-compile-time-polymorphism/

清楚并与该主题高度相关。


推荐阅读