我对多态性有疑问
public class A
{
protected int _i;
public A(int i)
{
_i = i;
}
}
//----------------------------------------------------------//
public class B extends A
{
public B(int i)
{
super(i+1);
}
}
//----------------------------------------------------------//
public class C extends B
{
public C(int i)
{
super(i);
}
public boolean equals (Object other)
{
return ((other!=null) &&
(other instanceof C) &&
(_i==((C) other)._i));
}
}
//----------------------------------------------------------//
public class D extends B
{
public D(int i)
{
super(i+1);
}
public boolean equals (D other)
{
return ((other!=null) &&
(_i==((D) other)._i));
}
}
public class tester {
public static void main (String [] args) {
A a = new A(1);
B b = new B(1);
C c = new C(1);
D d = new D(1);
B b1 = new D(1);
Object c1 = new C(1);
Object d1 = new D(1);
System.out.println (d1.equals(d));
}
}
为什么打印结果是假的? 当我在D中更改equals方法以接收Object而不是D时,它打印为True但方式? 请帮忙谢谢
答案 0 :(得分:0)
你已经得到了一半的答案。 "当我在D中改变equals方法接收Object而不是D时,它打印True"实际上是这个问题的关键部分。您需要了解的是覆盖和重载之间的区别。
public boolean equals (D other)
{
return ((other!=null) &&
(_i==((D) other)._i));
}
此方法将创建特定于equals(D d)
类的D
版本,以及<{strong> equals(Object o)
中预先存在的Object
。这是因为他们有不同的方法签名,并被称为重载。然而,这完美地运作:
public boolean equals (Object other)
{
return ((other!=null) &&
(_i==((D) other)._i));
}
这是因为覆盖超级类equals(Object o)
。最后一点说明。我知道你没有编写这段代码,但是编写这个方法更好的做法是这样的:
public boolean equals (Object other)
{
if(other instanceof D)
return ((other!=null) && (_i==((D) other)._i));
return false;
}
这样,如果您尝试将ClassCastException
与不相关的对象或继承树中较低的对象进行比较,则可以避免使用D
。