2013-02-25 10 views
6

Załóżmy, że mam następujących klasJava Casting z metodą zwraca

class A{ 
    public method(A a) { 
     System.out.println(3); 
    } 
} 

class B extends A{ 
    public void method (A a) { 
     System.out.println(2); 
    } 
    public void method (B b) { 
     System.out.println(1); 
    } 
} 

A obj = new B(); 
obj.method((B) obj); 
((B) obj).method((B) obj); 

Pierwsze wydruki metoda zawołać 2 a drukuje się drugi wywołać metodę 1. Dlaczego nie oba metoda nazywa wydruk 1?

+0

Należy pamiętać, że kod nie zostanie skompilowany w niezmienionym stanie. –

Odpowiedz

3

Ponieważ java wybiera metodę wywołania w czasie kompilacji. Kompilator bierze pod uwagę tylko "lewą stronę" zadania.

Tak więc po wpisaniu A obj = new B() kompilator "widzi" tylko metody z klasy A.

+0

Cóż ... kompilator "widzi" tylko, że takie metody są zdefiniowane, ale wywołuje metody obiektu, które w tym przypadku są tymi z klasy B, ponieważ ma tę samą metodę z tymi samymi argumentami. Dzieje się tak, ponieważ wszystkie metody w języku Java są wirtualne. –

4

void method (B b) B jest całkowicie nieznany dla swojej macierzystej A.

To logiczne, ponieważ w obj.method((B) obj);, rodzaj obj jest A co z reguły polimorfizmu może po prostu zadzwoń void method(A a) wersję klasy B.

class B extends A { 

    // This is an overridden method visible to A 
    public void method(A a) { 
     System.out.println(2); 
    } 

    // This is an overloaded method unknown from A 
    public void method(B b) { 
     System.out.println(1); 
    } 
} 

You can read this SO answer which explained Override vs. Overload.

1

pierwsze połączenie sposób odbywa się za pomocą odniesienia do obiektu typu A, tak, że odpowiednia metoda, która może zostać zastąpiona, nazywa .

W drugim przypadku pierwszy obsady odbywa się typu B, tak odpowiedniego sposobu określonego w klasie B, tj,

method (B b) 

jest tzw.