Ayer tuve una entrevista telefónica técnica de dos horas (que pasé, woohoo!), Pero me enmudeció por completo la siguiente pregunta sobre la vinculación dinámica en Java. Y es doblemente desconcertante porque solía enseñar este concepto a estudiantes universitarios cuando era TA hace algunos años, por lo que la perspectiva de que les di información errónea es un poco inquietante ...Java dynamic binding y overrining método
Aquí está el problema que me dieron:
/* 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);
}
}
que afirmó que la salida debe haber sido dos declaraciones de impresión independientes desde dentro del método reemplazado equals()
: en t1.equals(t3)
y t3.equals(t3)
. El último caso es bastante obvio, y en el primer caso, aunque t1
tiene una referencia de tipo Object, se ejemplifica como tipo Test, por lo que el enlace dinámico debe llamar a la forma anulada del método.
Aparentemente no. Mi entrevistador me animó a ejecutar el programa yo mismo, y he aquí, solo había una salida del método reemplazado: en la línea t3.equals(t3)
.
Mi pregunta es, ¿por qué? Como ya mencioné, aunque t1
es una referencia de tipo Object (por lo que el enlace estático invocaría el método Object equals()
), el enlace dinámico debería llamar a para invocar la versión más específica del método en función del tipo instanciado de la referencia. ¿Qué me estoy perdiendo?
encuentran amablemente mi post a esta respuesta, donde he hecho todo lo posible para explicar con más casos. Realmente agradecería sus entradas :) –