多态性java思维

时间:2014-07-09 10:32:25

标签: 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;
    }
}

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运行,原因是在运行时{{1} }属于y1类型,应该转到类B中的方法f吗?

2 个答案:

答案 0 :(得分:8)

  

因为在运行时y1是B类型,应该转到B类中的方法f?

没有

  • B.f()没有覆盖 A.f(),因为参数类型不同。它超载了它。
  • 在编译时挑选过载,而不是在执行时选择

如果您更改B.f()以接受A类型的参数而不是B,则您会看到它被执行。这并不取决于参数的执行时类型,而是取决于调用的目标的执行时类型。

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

答案 1 :(得分:1)

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