我有一个父类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}}方法
答案 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的实例