超载方法调用问题



请让我知道,因为过载是编译时间多态性,并且它考虑调用该方法的参考变量。假设如果我们具有参数重载的方法,则与哪种过载方法调用的方法将由我们调用方法的参数或对象投掷决定。

请在下面找到我的代码:

package com.overload;
class Bird {
    public void call(Bird bird) {
        System.out.println("Bird");
    }
}
class Crow extends Bird {
     void call(Crow bird) {
        System.out.println("Crow" );
    }
}
public class OverloadApp {    
    public static void main(String[] args) {
        Bird bird = new Bird();
        Bird crowBird = new Crow();
        Crow crow = new Crow();
        bird.call(bird);  // 1 - O/P:Bird
        bird.call(crow);  // 2 - O/P:Bird
        bird.call(crowBird);// 3 - O/P: Bird
        crow.call(bird); // 4 - O/P:Bird
        crow.call(crow); // 5 - O/P:Crow
        crow.call(crowBird); // 6 - O/P:Bird
        crowBird.call(bird); // 7 - O/P:Bird
        crowBird.call(crow); // 8 - O/P:Bird
        crowBird.call(crowBird); // 9 - O/P:Bird
    }
}

对于bird.call(crow); // 2 - O/P:Bird -BIRD将决定调用哪种超载方法或参数乌鸦决定调用哪种过载方法。

在看到O/P之后,我有点困惑。

谢谢kamal

此调用

    bird.call(crow);  // 2 - O/P:Bird
    crowBird.call(crow); // 8 - O/P:Bird

调用call(Bird bird),因为两个变量的声明的类型Bird,它仅知道该方法的Bird版本。它不知道另一个。

,但变量crow被声明为Crow,因此有两种方法可供选择...


如果是这种情况,那么
crow.call(bird); // 4 - O/P:Bird

crow.call(crowBird); // 6 - O/P:Bird 是鸟。在这两种情况下,o/p应该是"乌鸦",因为宣称的类型为 Crow。 - Kamal Verma

否。由于变量birdcrowBird被声明为类型Bird,它们不能传递到该方法的 crow 版本,尽管可用于可变crow

最新更新