方法覆盖和重载

Method overriding and overloading

我有下面列出的代码。为什么打印:"V" - "greet(Z)" - "greet(Z)"?我会说 "V" - "greet(V)" - "greet(Z)" 但似乎我在方法重载和覆盖方面遗漏了一些要点,有人可以解释我 and/or link 一些资源来掌握这个?

class Z {

    public void me() {
        System.out.print(" Z");

    }

    public void greet(Z z) {
        System.out.print ("greet(Z)");
    }

}
class V extends Z {

    @Override
    public void me() {
        System.out.println("V");
    }

    public void greet(V v) {
        System.out.println("greet(V)");
    }
}
public  class Quiz{
    public  static void main(String[] args) {

        Z a = new V();
        V b = new V();
        a.me();
        System.out.print("-");
        a.greet(b);
        System.out.print("-");
        a.greet(a);
    }
}

public void greet(V v)public void greet(Z z) 的重载版本:前者 不会覆盖 后者。

a.greet(b);

aZ类型,只有一种方法可以选择:greet(Z z).

a.greet(a);

aZ类型,还是只有一种方法可以选择:greet(Z z).

b.greet(a);

bV类型,有两种方式可以选择。由于 aZ 类型,因此将选择最合适的 greet(Z z)

b.greet(b);

bV类型,有两种方式可以选择。由于 bV 类型,因此将选择最合适的 greet(V V)

初始化时

  V b = new V();

b 具有 V 的引用,并且创建的对象类型为 V 所以当你打电话给

 a.greet(b);

它将首先查看正在接受类型 V 参数的 V class。

但是在第一行

Z a = new V();

您正在创建 V 的对象,但在调用

时类型为 Z.So
a.greet(b);

只会接受类型Z。因为V中的greet方法重载接受类型V。