方法覆盖和重载
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);
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)
。
初始化时
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。
我有下面列出的代码。为什么打印:"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);
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)
。
初始化时
V b = new V();
b 具有 V 的引用,并且创建的对象类型为 V 所以当你打电话给
a.greet(b);
它将首先查看正在接受类型 V 参数的 V class。
但是在第一行
Z a = new V();
您正在创建 V 的对象,但在调用
时类型为 Z.Soa.greet(b);
只会接受类型Z。因为V中的greet方法重载接受类型V。