多态性java q来自测试

时间:2014-03-19 13:19:00

标签: java

我对多态性有疑问

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但方式? 请帮忙谢谢

1 个答案:

答案 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