我有下面列出的代码。为什么它打印:“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);
}
}
最佳答案
public voidgreet(V v)
是 public voidgreet(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)
。
关于java - 方法重写和重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56593160/