【发布时间】:2013-12-01 14:14:23
【问题描述】:
假设我们有以下代码
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
这似乎有点奇怪。我本来希望显示“来自 TestEqual 的等于”,因为 t3 是一个 TestEqual 对象,所以应该调用来自 t1 的等于。我在这里的解释是 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方法,不打印。
【问题讨论】:
标签: java inheritance dynamic-binding static-binding