Sovraccarico / ereditarietà di Java

1

Ho cercato di capire chiaramente quale sia la fine del codice follwing:

class C {

public int foo(C p) { return 1; }

}

class D extends C {

public int foo(C p) { return 2; }
public int foo(D p) { return 3; }

}

C p = new C();
C q = new D();
D r = new D();

int i = p.foo(r);
int j = q.foo(q);
int k = q.foo(r);

In definitiva, dopo aver setacciato molti forum, sono giunto alla comprensione generale del perché i = 1, j = 2 e k = 2, ma non sono ancora del tutto chiaro sul perché k = 2, principalmente perché I ' Ho ottenuto spiegazioni diverse che hanno lo stesso risultato.

A mio avviso, q è staticamente di tipo C, quindi al momento della compilazione, la corrispondenza migliore è foo (C p) in C, ma è sovrascritta da D's foo (C p) in fase di esecuzione. Quindi, dato che originariamente era la migliore corrispondenza e solo così accade per estendere C, viene utilizzato D's foo (C p) piuttosto che D's foo (D p). La mia comprensione di questo è corretta?

    
posta TacoB0t 18.10.2016 - 03:02
fonte

1 risposta

3

Sì, la tua comprensione di ciò è corretta.

In fase di esecuzione, per quanto riguarda la JVM, l'overloading non esiste, perché il compilatore si è assicurato che tutti i metodi avessero nomi diversi (in realtà, descrittori diversi). Questo è essenzialmente ciò che vede la JVM:

class C {
    public int foo_taking_C_returning_int(C p) { return 1; }
}

class D extends C {
    // overrides the method in C
    public int foo_taking_C_returning_int(C p) { return 2; }
    // doesn't override anything because there's no matching method in C
    public int foo_taking_D_returning_int(D p) { return 3; }
}

C p = new C();
C q = new D();
D r = new D();

int i = p.foo_taking_C_returning_int(r);
int j = q.foo_taking_C_returning_int(q);
int k = q.foo_taking_C_returning_int(r);
    
risposta data 18.10.2016 - 03:20
fonte

Leggi altre domande sui tag