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?