2017-05-06 13 views
0

オーバーロードがコンパイル時の多態性であることを私に教えてください。メソッドを呼び出すための参照変数を考慮してください。オーバーロードされたメソッドが呼び出すパラメータオーバーロードされたメソッドがある場合、メソッドを呼び出すパラメータまたはオブジェクトスローによって決定されると仮定します。オーバーロードメソッド呼び出しの問題

私のコードの下に見つけてください:bird.call(crow); // 2 - O/P:Birdについて

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

- 鳥がメソッドが呼び出されたり、パラメータカラスが呼び出されるメソッドをオーバーロードしていることを決定されたオーバーロードされたかを決定します。

O/Pを見てから少し混乱しています。

おかげで、 カマル

+0

あなたの質問がありますか?これはあまり明確ではありません。 – Carcigenicate

+0

こんにちは、ちょうどO/P 2が鳥である理由を知りたかったのですが、私はcrowオブジェクト(参照も含む)を渡し、オーバーロードされたメソッドが呼び出されるように、Crowでなければならないと思っていました。 –

答えて

0

この呼び出し

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

コール call(Bird bird)両方の変数の宣言された型 が唯一の方法の Birdバージョンを知っている Birdですので。それは他のものを知らない。

しかし、中から選択するには、2つの方法があるように、これはなぜ
crow.call(bird); // 4 - O/P:Bird

crow.call(crowBird); // 6 - O/P:Birdよりも事実である場合、変数crow


... Crowであると宣言されます はBirdです。これらの2つのシナリオでは、宣言されたタイプがCrowであるため、O/Pは「Crow」でなければなりません。 - 可変birdcrowBirdがタイプBirdであると宣言されているので、変数crowのために利用可能であるがカマルバーマ

号 それらは、法のクロウバージョンに渡すことができません。

+0

これがcrow.call(bird)の場合の場合です。 // 4 - O/P:Birdとcrow.call(crowBird); // 6 - O/P:鳥は鳥です。これらの2つのシナリオでは、O/PはCrowとする必要があります。 –

+0

はい、私の悪い..それを得た..ありがとう –

関連する問題