Вчора у мене було двогодинне технічне співбесіду по телефону (яке я пройшов, вуху!), Але я повністю заглушив наступне питання щодо динамічного прив'язки в Java. І це подвійно спантеличує, тому що я викладав цю концепцію студентам, коли ще кілька років тому працював на технічному рівні, тому перспектива, що я дав їм дезінформацію, трохи занепокоєння ...
Ось проблема, яку мені дали:
/* 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);
}
}
Я стверджував, що на виході мали бути два окремі оператори друку з перезаписаного equals()методу: at t1.equals(t3)та t3.equals(t3). Останній випадок досить очевидний, і з першим випадком, хоча він t1має посилання типу Object, він створюється як тип Test, тому динамічне прив'язування повинно викликати замінену форму методу.
Мабуть, ні. Мій інтерв'юер заохочував мене самостійно запускати програму, і ось, ось такий перевизначений метод мав лише один результат: на лінії t3.equals(t3).
Тоді моє питання: чому? Як я вже згадував, навіть незважаючи на те t1, що це посилання типу Object (тому статичне прив'язування викликало б equals()метод Object ), динамічне прив'язування повинно дбати про виклик найбільш конкретної версії методу на основі екземпляра типу посилання. Чого мені не вистачає?

