为什么调用父class方法?
Why is the parent class method called?
为什么我在创建子对象时调用父 class 方法。这甚至不是静态方法。
class Parent {
public String pubMethod(Integer i) {
return "p";
}
}
public class Child extends Parent {
public String pubMethod(int i) {
return "c";
}
public static void main(String[] args) {
Parent u = new Child();
System.out.println(u.pubMethod(1)); // Prints "p" why??
}
}
这里我传递了一个原始的 int
。仍然转到父方法。
有什么解释吗?
当你调用u.pubMethod(1)
时,编译器只考虑Parent
class方法的签名,因为Parent
是[=的编译类型类型15=]。由于 public String pubMethod(Integer i)
是 Parent
中唯一具有所需名称的方法,因此这是选定的方法。 Child
class 的 public String pubMethod(int i)
不被视为候选人,因为 Parent
没有此类签名的方法。
在运行时,sub-class的方法,public String pubMethod(int i)
,不能覆盖super-class的方法public String pubMethod(Integer i)
,因为它有不同的签名。因此 Parent
class 方法被执行。
为了执行 Child
class,您必须更改其签名以匹配 Parent
class 方法的签名,这将允许它覆盖 Parent
class 方法:
public class Child extends Parent {
@Override
public String pubMethod(Integer i) {
return "c";
}
}
或者您可以向 Parent
class 添加第二个方法,现有 Child
class 方法将覆盖该方法:
class Parent {
public String pubMethod(Integer i) {
return "pInteger";
}
public String pubMethod(int i) {
return "pint";
}
}
在第一种情况下,编译器仍将有一个方法可供选择 - public String pubMethod(Integer i)
- 但在 运行 时,Child
class 方法将覆盖它。
在第二种情况下,编译器将有两种方法可供选择。它将选择 public String pubMethod(int i)
,因为文字 1
的类型是 int
。在 运行 时间,Child
class public String pubMethod(int i)
方法将覆盖它。
我认为您没有正确创建子对象,您有:
Parent child = new Child();
但你应该:
Child child = new Child();
为什么我在创建子对象时调用父 class 方法。这甚至不是静态方法。
class Parent {
public String pubMethod(Integer i) {
return "p";
}
}
public class Child extends Parent {
public String pubMethod(int i) {
return "c";
}
public static void main(String[] args) {
Parent u = new Child();
System.out.println(u.pubMethod(1)); // Prints "p" why??
}
}
这里我传递了一个原始的 int
。仍然转到父方法。
有什么解释吗?
当你调用u.pubMethod(1)
时,编译器只考虑Parent
class方法的签名,因为Parent
是[=的编译类型类型15=]。由于 public String pubMethod(Integer i)
是 Parent
中唯一具有所需名称的方法,因此这是选定的方法。 Child
class 的 public String pubMethod(int i)
不被视为候选人,因为 Parent
没有此类签名的方法。
在运行时,sub-class的方法,public String pubMethod(int i)
,不能覆盖super-class的方法public String pubMethod(Integer i)
,因为它有不同的签名。因此 Parent
class 方法被执行。
为了执行 Child
class,您必须更改其签名以匹配 Parent
class 方法的签名,这将允许它覆盖 Parent
class 方法:
public class Child extends Parent {
@Override
public String pubMethod(Integer i) {
return "c";
}
}
或者您可以向 Parent
class 添加第二个方法,现有 Child
class 方法将覆盖该方法:
class Parent {
public String pubMethod(Integer i) {
return "pInteger";
}
public String pubMethod(int i) {
return "pint";
}
}
在第一种情况下,编译器仍将有一个方法可供选择 - public String pubMethod(Integer i)
- 但在 运行 时,Child
class 方法将覆盖它。
在第二种情况下,编译器将有两种方法可供选择。它将选择 public String pubMethod(int i)
,因为文字 1
的类型是 int
。在 运行 时间,Child
class public String pubMethod(int i)
方法将覆盖它。
我认为您没有正确创建子对象,您有:
Parent child = new Child();
但你应该:
Child child = new Child();