问题描述
下面是我试图运行的代码。如果我从 func() 方法中删除参数而不是 obj.func() 调用 B 类方法,但如果我引入参数,它会调用 A 类方法。
public class A {
void func(A obj) {
System.out.println("in A");
}
}
public class B extends A{
void func(B obj) {
System.out.println("in B");
}
public static void main(String[] args) {
A obj = new B();
obj.func(null);// calls A class method,but why???
}}
解决方法
我想您正在尝试覆盖类 B 中 A 类的方法 func。无论如何,您的代码正在重载该方法,因为A.func 和B.func 的参数类型不同。前者接收A类型的对象obj,而第二个接收B类型的对象obj。
public class A {
void func(A obj) {
System.out.println("in A");
}
}
public class B extends A{
void func(B obj) { // your solution,which creates a DIFFERENT method using overloading
System.out.println("OVERLOAD in B");
}
void func(A obj) { // proper override of *A.func(A obj)*
System.out.println("OVERRIDE in B");
}
} // <- pay attention,you forgot this bracket
public static void main(String[] args) {
A obj = new B();
obj.func(null);// now it calls the right method
}}
如果去掉func的参数,这两个函数是相同的,因此你有一个适当的覆盖。这就是为什么删除参数代码正常工作的原因。
我希望我能帮到你,无论如何你可以在这里找到更多信息:
- 方法重载,这就是您之前的代码所做的:https://www.javatpoint.com/method-overloading-in-java
- 覆盖方法,这是您的目标:https://www.javatpoint.com/method-overriding-in-java
- 运行时多态性,这就是你写A obj = new B()时发生的情况; https://www.javatpoint.com/runtime-polymorphism-in-java
祝您有美好的一天!