2013-02-25 18 views
6

Supponiamo che io abbia le seguenti classiJava Casting con Metodo Chiamate

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); 

Le prime stampe metodo di chiamata fuori 2, mentre le stampe secondo metodo di chiamata fuori 1. Perché non sia di metodo chiama stampare 1?

+0

Nota che il codice non verrà compilato come è. –

risposta

3

Perché java seleziona il metodo per chiamare in fase di compilazione. E il compilatore prende in considerazione solo il "lato sinistro" di un compito.

Quindi quando si digita A obj = new B() il compilatore solo "vede" i metodi nella classe A.

+0

Bene ... il compilatore "vede" solo che tali metodi sono definiti, ma chiama i metodi dell'oggetto, che nel caso sono quelli della classe B perché ha lo stesso metodo con gli stessi argomenti. Ciò accade perché tutti i metodi in java sono virtuali. –

4

void method (B b) di B è totalmente sconosciuto per il suo genitore A.

E 'logico, perché in obj.method((B) obj);, il tipo di obj è A che a sua regola il polimorfismo può chiamare void method(A a) versione di classe 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

la prima chiamata metodo viene fatto usando riferimento a un oggetto di tipo A, per cui il metodo corrispondente, che potrebbe essere sovrascritto, è chiamato .

Nel secondo caso prima del getto è fatto di tipo B, metodo definito nella classe B in modo corrispondente, cioè,

method (B b) 

è chiamato.

Problemi correlati