我正在用java尝试这段代码,但结果输出对我来说并不清楚有人能解释下输出的原因吗

rur96b6h  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(398)

这个问题在这里已经有答案了

为什么在本例中不调用子类方法,而在java的动态多态性中调用它(4个答案)
15天前关门了。
下面是我试图运行的代码。如果我从func()方法中删除参数,则obj.func()调用b class方法,但如果我引入参数,则它调用class方法。

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???
}}
bpsygsoo

bpsygsoo1#

我想您正试图重写类b中类a的方法func。无论如何,您的代码正在重载该方法,因为a.func和b.func的参数类型不同。前者接收类型为a的object obj,而第二个接收类型为b的object 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
运行时多态性,这就是编写obj=new b()时发生的情况;https://www.javatpoint.com/runtime-polymorphism-in-java
祝您今天过得愉快!

相关问题