2017-05-06 89 views
0

请让我知道重载是编译时多态并且它考虑调用方法的引用变量。假设我们有参数重载方法而不是重载方法调用将由我们调用方法的参数或对象抛出来决定。重载方法调用问题

请在下面找到我的代码:

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 - 伯德将决定哪个重载的方法被调用或参数乌鸦决定哪一个重载的方法被调用。

由于看到O/P后我有点困惑。

感谢, 卡迈勒

+0

你的问题是什么?这不是很清楚。 – Carcigenicate

+0

你好,只是想知道为什么O/P 2是鸟我以为它应该是乌鸦,因为我已经通过乌鸦对象(也是参考),并且重载的方法将被调用是由参考决定的。 –

回答

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。 - 卡迈勒·维尔马

号由于可变birdcrowBird被声明为Bird类型它们不能被传递到乌鸦版的方法,虽然它是可用于可变crow

+0

如果是这样的话为什么crow.call(鸟); // 4 - O/P:Bird and crow.call(crowBird); // 6 - O/P:鸟是鸟。在这两种情况下,O/P应该是Crow,因为声明的类型是Crow。 –

+0

是的,我的坏..得到它..谢谢 –