2017-05-06 48 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

是的,我的壞..得到它..謝謝 –