我的代码看起来像这样,但这是一个简化的版本:
A类:
public class A{
public void testArgs(A a){
System.out.println("A");
}
public void test(){
System.out.println("A");
}
}
B级:
public class B extends A{
public void testArgs(B a){
System.out.println("B");
}
public void test(){
System.out.println("B");
}
}
主班:
public class Main{
public static void main(String[] args){
a(new B()).testArgs(new B()); // prints A
(new B()).testArgs(new B()); // prints B
a(new B()).test(); // prints B
}
public static A a(B b){
return b;
}
}
为什么
a(new B()).testArgs(new B())
打印A而不打印B?有某种解决方法/解决方法?
编辑:
澄清:
我真正想要的是当用A调用超类方法时运行的超类方法,而用B调用testArgs时运行子类的方法。
转换也不是一种选择,因为在实际代码中,与这里不同,我不知道方法调用的结果是否实际上是B。
编辑:
解:
谢谢大家的回答。感谢您对覆盖的澄清。我用它来实现所需的行为。
对于以后遇到类似问题的任何人:
将B类更改为
public class B extends A{
public void testArgs(A a){ // Corrected overriding, thanks
if(a instanceof B) // Check if it is an instance of B
System.out.println("B"); // Do whatever
else // Otherwise
super.testArgs(a); // Call superclass method
}
public void test(){
System.out.println("B");
}
}
最佳答案
这两个testArgs
函数是不同的。一个使用A
,另一个使用B
。因此,B
版本不会覆盖A
版本。由于a(new B())
的类型为A
并且B
扩展了A
,因此它将是A
版本运行。
有一个“解决方法”:
public class B extends A{
public void testArgs(A a){ // <-- note how this is A a, not B a
System.out.println("B");
}
public void test(){
System.out.println("B");
}
}
然后,您将在所有3种情况下看到
B
(因为B
的testArgs
将覆盖A
的testArgs
)