我有下面列出的代码。为什么打印:“ V”-“ greet(Z)”-“ greet(Z)”?我会说“ V”-“ greet(V)”-“ greet(Z)”,但是我似乎在方法重载和重写方面缺少一些要点,有人可以向我解释一下和/或链接一些资源来掌握这一点吗? ?
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);
}
}
答案 0 :(得分:0)
public void greet(V v)
是public void greet(Z z)
的重载版本:前者不会覆盖后者。
a.greet(b);
a
的类型为Z
,只有一种方法可供选择:greet(Z z)
。
a.greet(a);
a
的类型为Z
,仍然只有一种方法可供选择:greet(Z z)
。
b.greet(a);
b
的类型为V
,有两种方法可供选择。由于a
的类型为Z
,因此将选择最合适的greet(Z z)
。
b.greet(b);
b
的类型为V
,有两种方法可供选择。由于b
的类型为V
,因此将选择最合适的greet(V V)
。
答案 1 :(得分:0)
初始化时
V b = new V();
b的引用为V,并且创建的对象类型为V 所以当你打电话
a.greet(b);
它将首先查看接受V类型参数的V类。
但在第一行
Z a = new V();
您正在创建V的对象,但类型为Z。因此在调用
时a.greet(b);
仅接受类型Z。因为V中的greet方法已重载以接受类型V。