多态性与java思维

多态性与java思维,java,polymorphism,Java,Polymorphism,考虑以下代码: 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; } } 我不明白的是为什么方法f在类A(并且打印为false)中运行而不是B,因为在运

考虑以下代码:

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


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

运行时y1中的原因属于类型B,应该转到类B中的方法f

否:

  • B.f()
    不会覆盖
    A.f()
    ,因为参数类型不同。它超载了
  • 重载是在编译时选择的,而不是在执行时
如果将
B.f()
更改为接受
a
类型的参数,而不是
B
,您将看到它被执行。这并不取决于参数的执行时间类型,而是取决于调用目标的执行时间类型


所选择的方法实现决不取决于参数的执行时间类型。

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

什么是
C
对象?我猜这是A的另一个子类,但它没有显示在任何地方。是的,原因与question@DanTemple:鉴于
z1
z2
没有在任何地方使用,它们是不相关的(应该从问题中删除)。公平,正如@JonSkeet指出的,在这种情况下,它们不应该在问题中。对不起,我一点也不明白。“这里不存在重力低”是什么意思?A y1=新的B(10);-->它的多发性。当y1调用f方法时,他转到类A中的方法,但由于他也是B类型,他在继承中“向下看”,并检查是否存在相同的方法“向下”。这一次是因为在类A中执行方法时存在重载而不是重写。
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));
    }
}