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);
}
}
我断言输出应该是来自重写方法中的两个单独的 print 语句:at 和 。后一种情况已经足够明显了,对于前一种情况,即使具有 Object 类型的引用,它也被实例化为 Test 类型,因此动态绑定应调用该方法的重写形式。equals()
t1.equals(t3)
t3.equals(t3)
t1
显然不是。我的面试官鼓励我自己运行程序,瞧,被覆盖的方法只有一个输出:在行 。t3.equals(t3)
那么我的问题是,为什么?正如我已经提到的,即使它是 Object 类型的引用(因此静态绑定将调用 Object 的方法),动态绑定也应该负责基于引用的实例化类型调用方法的最特定版本。我错过了什么?t1
equals()