This question already has answers here:
Polymorphism in Overloaded and Overridden Methods

(4个答案)


3年前关闭。



class PolymorphisomTest {

    class Base {
        public void doTest(double d) {
            System.out.println("From Base");
        }
    }

    class DerivedBase extends Base {

        public void doTest(int d) {
            System.out.println("From Derived Base");
        }
    }

    public void use(Base  base) {
        base.doTest(3);
    }
    public void run() {
        use(new Base());
        use(new DerivedBase ());
    }
    public static void main(String []cmd) {
        new PolymorphisomTest ().run();
    }
}

这里是父类的 doTest(double d)和子类的 doTest(int d),但是当我调用 base.doTest(3)时,即使我的对象引用不同,它也会始终调用父类方法。背后的原因是什么?

最佳答案

doTest(double d)是与void doTest(int d)完全不同的方法,因为它们具有不同的参数列表。实际上根本没有任何多态性。 DerivedBase声明了一种新方法,而不是重载Base.doTest。好像您已经这样做:

class Base {
    public void doTest(double d) {
        System.out.println("From Base");
    }
}

class DerivedBase extends Base {
    public void doSomethingElse(int d) {
        System.out.println("From Derived Base");
    }
}

更改参数的类型会更改方法签名,并使其成为新方法,而不是覆盖父类的方法。

调用base.doTest(3)时,编译器将调用doTest(double),因为这是Base类中与参数匹配的唯一方法。由于该方法没有被任何方法覆盖,因此会调用Base.doTest

09-15 14:55