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

时间:2017-02-28 13:44:20

标签: java compilation overloading

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

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;
    }

}

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 39。

我尝试将此添加到AA并打印6 ..

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

2 个答案:

答案 0 :(得分:0)

没有方法覆盖,

public int f(AA val)

public int f(BB val)

没有相同的签名。

当您致电y1.f(y2)y1类型为AAy2类型为BB时):

AA没有f(BB)方法,因此最近的方法是f(AA),而BB不会覆盖此方法

答案 1 :(得分:0)

您显然是从 y1 调用函数(f),这是 AA 引用类型。