Java - 使用扩展类型重载方法选择

Java - Overloaded method selection with extended type

我想了解这段代码背后的逻辑:

public class AA
{
    private int num;

    public void setNum(int num) {
        this.num = num;
    }

    public int getNum() {

        return num;
    }

    public AA(int num) {

        this.num = num;
    }

    public int f(AA val)
    {
        num = val.num;
        return num;
    }

}

class BB:

public class BB extends AA
{

    public BB(int num) {
        super(num);
    }
    public int f(BB val)
    {
        setNum(val.getNum()*2);
        return getNum();
    }

}

主要内容:

public static void main(String[] args) throws Exception
{
    AA y1 = new BB(2);
    BB y2 = new BB(3);

    System.out.println(y1.f(y2));

为什么输出是 3 而不是 6?

编辑 - 我知道这不是最重要的。我的问题是为什么它没有调用 BB 的 f?我发送了 BB 变量。不是AA。

我理解如果在编译时它会选择A的f但之后它需要选择B的f。

我尝试将其添加到 AA 中,结果打印出 6..

    public int f(BB val)
    {
        System.out.println("Im here");
        num =1+ val.getNum()*2;
        return num;
    }

没有覆盖方法,

public int f(AA val)

public int f(BB val)

没有相同的签名。

当您调用 y1.f(y2) 时(y1 属于 AA 类型,y2 属于 BB 类型):

AA 没有 f(BB) 方法,所以调用最接近的方法 f(AA),并且 BB 不会覆盖此方法。

你显然是从 y1 调用一个函数 (f),它是一个 AA 引用类型。