重载方法调用问题

时间:2017-05-06 17:31:54

标签: java overloading

请告诉我,因为重载是编译时多态性,它会考虑用于调用方法的引用变量。假设我们有参数重载方法,那么重载方法将调用将由我们调用方法的参数或对象throw决定。

请在下面找到我的代码:

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将决定调用哪个重载方法或参数crow决定调用哪个重载方法。

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

谢谢, 哈拉

1 个答案:

答案 0 :(得分:0)

此调用

    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”,因为声明的类型为Crow。 - Kamal Verma

没有。 由于变量birdcrowBird被声明为Bird类型,因此它们无法传递给方法的 Crow 版本,尽管它可用于变量{ {1}}。