为什么在这种情况下调用父类方法而不调用子类?

时间:2014-11-13 07:40:48

标签: java inheritance

我有一个父类A,它的子类B.两个都有doSomething方法,带有diff类型的参数。

A类

package Inheritance;

public class A {

    public void doSomething(Object str){
        System.out.println("Base impl:"+str);
    }
}

B类

package Inheritance;

public class B extends A{

    public void doSomething(String str){
        System.out.println("Child impl:"+str);
    }

    public static void main(String[] args) {

        A a = new B();
        a.doSomething("override");

    }
}

当我运行它时,我得到“Base impl:override”作为输出!

a指向B的对象,而他传递的参数为String,所以不应该调用B的{​​{1}}方法

4 个答案:

答案 0 :(得分:4)

当您使用类型A的引用时,只能看到为类A定义的方法。由于B中的doSomething未覆盖A中的doSomething(因为它具有不同的签名) ,它没有被称为。

如果要使用类型B的引用,则两种方法都可用,并且将选择B的doSomething,因为它具有更具体的参数(String vs Object)。

答案 1 :(得分:0)

我想这不被认为是方法覆盖的情况,因为签名不完全相同。将String参数更改为B中的Object。

答案 2 :(得分:0)

在A类中,您已声明方法doSomething(Object obj)。但是,在B类中,您已声明方法doSomething(String str),其参数类型与A类中的参数类型不同。这意味着B类doSomething不会覆盖A级' s doSomething

要获得所需的输出,请执行以下操作(我省略了获取更通用的代码示例的主要方法):

public class A {
    public void doSomething(Object str){
        System.out.println("Base impl:"+str);
    }
}

public class B extends A {
    // Helpful annotation: It tells you
    // if you aren't overriding any known method
    @Override
    public void doSomething(Object str) {
        System.out.println("Child impl:"+str);
    }
}

答案 3 :(得分:0)

正如@Eran所说

当您使用类型A的引用时,只能看到为类A定义的方法。由于B中的doSomething不会覆盖A中的doSomething(因为它具有不同的签名),因此不会调用它

如果您想调用B中定义的方法,则需要将其强制转换为

((B)a).doSomething("override");

或者您必须隐式使用B的实例