Вчора у мене було двогодинне технічне співбесіду по телефону (яке я пройшов, вуху!), Але я повністю заглушив наступне питання щодо динамічного прив'язки в 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 ), динамічне прив'язування повинно дбати про виклик найбільш конкретної версії методу на основі екземпляра типу посилання. Чого мені не вистачає?