Java多态思想

4
请参考以下代码:

考虑以下代码:

public class A{
    private int num;
    public A(int n){
        num = n;
    }
    public int getNum(){
        return num;
    }
    public boolean f(A a){
        return num == a.num * 2;
    }
}

public class B extends A {
    public B(int n) {
        super(n);
    }

    public boolean f(B b) {
        return getNum() == b.getNum();
    }
}

public class Main
{
    public static void main(String[] args){
        A y1 = new B(10);
        B y2 = new B(10);
        System.out.println("y1.f(y2) is: "+y1.f(y2));
    }
}

我不明白的是为什么方法 f 在类 A 中运行(并且打印 false),而不是在类 B 中运行,因为在运行时 y1 的类型是 B,应该向下执行到类 B 中的方法 f

什么是 C 对象?我猜它是 A 的另一个子类,但在任何地方都没有显示。 - Dan Temple
1
是的,原因与问题无关。 - Yuval Levy
@DanTemple:鉴于z1z2没有被使用,它们是无关紧要的(应该从问题中删除)。 - Jon Skeet
公平的,正如@JonSkeet所指出的那样,在那种情况下,它们不应该出现在问题中。 - Dan Temple
2个回答

8
因为在运行时,y1的类型是B,所以应该进入类B中的方法f吗?
不是的:
B.f()没有覆盖A.f(),因为参数类型不同。它进行了重载。
重载在编译时选择,而不是在执行时选择。
如果将B.f()更改为接受类型A而不是类型B的参数,则会看到它被执行。这并不取决于参数的执行时类型,而是取决于调用目标的执行时类型。
所选择的方法实现永远不取决于参数的执行时类型。

1
请注意,f函数中B类和A类的参数不同。这就是为什么“重力低”在这里不存在,而这一次它进入了A.f函数的原因。

抱歉,我完全不理解。"gravity low don't exist here” 是什么意思? - Dawood ibn Kareem
y1 = new B(10); --> 这是多态。当 y1 调用 f 方法时,它会进入 A 类中的方法,但因为它也是 B 类型,所以它会“向下查找”继承并检查是否有相同的“向下”方法。这次由于存在重载而不是覆盖,他执行 A 类中的方法。 - Udi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接