为什么它总是调用父类方法" doTest(double d)"?

时间:2017-02-18 05:58:33

标签: java

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)它总是调用父类方法,即使我的对象引用不同。它背后的原因是什么?

3 个答案:

答案 0 :(得分:0)

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被调用。

答案 1 :(得分:0)

DerivedBase类从基类继承了你的doTest。现在,它有两种方法 -     doTest(双d)     doTest(int d)

您没有覆盖方法,但通过提供不同的参数来重载它。如果需要使用double作为参数覆盖doTest add方法。

它不调用doTest(int d)的原因是当我们从父引用调用时,它在编译期间搜索它们的方法并与它们绑定。并且在运行时,它的相同方法具有来自对象的相同签名。

答案 2 :(得分:0)

要覆盖方法,必须匹配派生类中的方法签名。当您从double更改为int时,您会创建一个新方法。来自Defining Methods - The Java Tutorials

  

定义:方法声明的两个组件包括方法签名 - 方法的名称和参数类型。

@Override注释可以保护您免受此特定类错误的影响。你可以做点什么,

class DerivedBase extends Base {
    @Override
    public void doTest(double d) {
        System.out.println("From Derived Base");
    }
}