Ieri ho avuto un colloquio telefonico tecnico di due ore (che ho superato, woohoo!), Ma ho completamente smorzato la seguente domanda riguardante l'associazione dinamica in Java. Ed è doppiamente sconcertante perché insegnavo questo concetto agli studenti universitari quando ero un assistente tecnico alcuni anni fa, quindi la prospettiva di aver dato loro informazioni sbagliate è un po 'inquietante ...
Ecco il problema che mi è stato dato:
/* What is the output of the following program? */
public class Test {
public boolean equals( Test other ) {
System.out.println( "Inside of Test.equals" );
return false;
}
public static void main( String [] args ) {
Object t1 = new Test();
Object t2 = new Test();
Test t3 = new Test();
Object o1 = new Object();
int count = 0;
System.out.println( count++ );// prints 0
t1.equals( t2 ) ;
System.out.println( count++ );// prints 1
t1.equals( t3 );
System.out.println( count++ );// prints 2
t3.equals( o1 );
System.out.println( count++ );// prints 3
t3.equals(t3);
System.out.println( count++ );// prints 4
t3.equals(t2);
}
}
Ho affermato che l'output avrebbe dovuto essere due istruzioni print separate all'interno del equals()
metodo sovrascritto : at t1.equals(t3)
e t3.equals(t3)
. Il secondo caso è abbastanza ovvio e con il primo caso, anche se t1
ha un riferimento di tipo Object, viene istanziato come tipo Test, quindi l'associazione dinamica dovrebbe chiamare la forma sovrascritta del metodo.
Apparentemente no. Il mio intervistatore mi ha incoraggiato a eseguire il programma da solo, ed ecco, c'era solo un singolo output dal metodo sovrascritto: in linea t3.equals(t3)
.
La mia domanda quindi è: perché? Come ho già detto, anche se t1
è un riferimento di tipo Object (quindi l'associazione statica richiama il equals()
metodo di Object ), l'associazione dinamica dovrebbe occuparsi di invocare la versione più specifica del metodo in base al tipo di riferimento istanziato. Cosa mi sto perdendo?