【发布时间】:2019-06-14 07:09:34
【问题描述】:
我有下面列出的代码。为什么打印:“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);
}
}
【问题讨论】:
-
您的误解是关于声明和实例化,而不是关于覆盖/重载。 a 被声明为 Z 类型,而不是 V 类型。
-
这个我知道,但是当我使用方法a.greet(b)时为什么它使用Z的greet方法。这不是应该使用动态类型方法吗?
-
a是Z类型的对象,并且只有Z类型的对象,没有可能的覆盖方法可以在那里调用。 -
@karalis1 正如我在第一条评论中所说:a 被声明为 Z 类型,而不是 B 类型。所以它正在使用它应该使用的东西。
-
你覆盖
me(),因为它的签名被完全复制,但重载great(),因为使用了不同的参数类型。所以a.great(...)在类Z上被调用,无论传递的值如何,总是打印“greet(Z)”
标签: java eclipse overriding overloading