我的代码看起来像这样,但这是一个简化的版本:

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(因为BtestArgs将覆盖AtestArgs)

08-05 19:25