假设我们有以下代码
class TestEqual{
public boolean equals(TestEqual other ) {
System.out.println( "In equals from TestEqual" ); return false;
}
public static void main( String [] args ) {
Object t1 = new TestEqual(), t2 = new TestEqual();
TestEqual t3 = new TestEqual();
Object o1 = new Object();
int count = 0;
System.out.println( count++ );// shows 0
t1.equals( t2 ) ;
System.out.println( count++ );// shows 1
t1.equals( t3 );
System.out.println( count++ );// shows 2
t3.equals( o1 );
System.out.println( count++ );// shows 3
t3.equals(t3);
System.out.println( count++ );// shows 4
t3.equals(t2);
}
}
基本上,在 TestEqual 类(当然,扩展 Object)中,我们有一个从 Object 重载 equals 方法的方法。
此外,我们还有一些变量:Object t1、t2 实例化为 TestEqual、TestEqual t3 实例化为 TestEqual 和 Object o1 实例化为 Object。
如果我们运行程序,这将是输出。
0
1
2
3
In equals from TestEqual
4
这个例子似乎比通常的 Car c = new Vehicle(); 复杂一些。c.驱动器();因为我们调用方法的对象实例化与其类型不同,而且方法的参数实例化与其类型不同。
我想检查我是否正确理解了当我们调用每个方法时会发生什么,逐步关于绑定。
show 0
t1.equals(t2)
show 1
t1 被视为一个 TestEqual 对象。方法equals被重载,所以绑定是静态的,这意味着我们将t2作为一个Object传递,所以它会调用继承自Object超类的equals方法,所以它不会显示任何文本。
show 1
t1.equals(t3)
show 2
这似乎有点奇怪。我本来希望显示“In equals from TestEqual”,因为 t3 是一个 TestEqual 对象,所以应该调用来自 t1 的 equals。我在这里的解释是 t1 是静态绑定的并且被视为一个对象,因此调用从 Object 类继承的方法 equals ,参数 TestEqual t3 被向上转换为 Object。但这是否意味着 t1.equals(t2) 的先前解释是错误的?
show 2
t3.equals(o1);
show 3
t3 是一个TestEqual 对象,参数o1 是一个Object,所以调用了继承自Object 的equals 方法,所以什么也不打印。
show 3
t3.equals(t3)
show 4
t3 是一个TestEqual 对象,参数是一个TestEqual 对象,所以TestEqual 中的重载方法会被调用,打印“In equals from TestEqual”。
show 4
t3.equals(t2)
t3是一个TestEqual对象,由于静态绑定(方法重载),参数是一个Object,所以调用继承自Object的equal方法,什么也不打印。