Вчера у меня было двухчасовое техническое телефонное интервью (которое я прошел, woohoo!), Но я полностью перепутал следующий вопрос относительно динамической привязки в Java. И это вдвойне озадачивает, потому что я преподавал эту концепцию студентам, когда я был ТА несколько лет назад, поэтому перспектива, что я дал им дезинформацию, немного беспокоит ...Динамическое связывание 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()
метода: в t1.equals(t3)
и t3.equals(t3)
. Последний случай достаточно очевиден, и в первом случае, хотя t1
имеет ссылку типа Object, он создается как тип Test, поэтому динамическое связывание должно вызывать переопределенную форму метода.
Видимо, нет. Мой собеседник предложил мне запустить программу самостоятельно, и вот, был только один вывод из переопределенного метода: на линии t3.equals(t3)
.
Вопрос в том, почему? Как я уже упоминал, хотя t1
является ссылкой типа Object (поэтому статическая привязка вызовет метод Object equals()
), динамическое связывание должно позаботиться о вызове наиболее конкретной версии метода на основе экземпляра типа ссылки. Что мне не хватает?
Пожалуйста, найти свой пост, чтобы этот ответ, где я старался изо всех сил, чтобы объяснить с помощью дополнительных случаев. Я бы очень признателен за ваши входы :) – 2017-04-03 10:21:30