代码学习—继承理解
public class FatherClass {
protected String value;
public FatherClass(String value){
this.value = value;
}
public boolean equals(FatherClass father){
System.out.println("FatherClass.equals()");
if(father == this){
return true;
}
if(father instanceof FatherClass){
return father.value.equals(this.value);
}
return false;
}
public static void main(String[] args){
FatherClass father = new FatherClass("sd");
ChildClass child = new ChildClass("sd");
System.out.println(father.equals(child));
}
}
class ChildClass extends FatherClass{
public ChildClass(String value) {
super(value);
// TODO Auto-generated constructor stub
}
public boolean equals(ChildClass child){
System.out.println("ChildClass.equals()");
if(child == this){
return true;
}
if(child instanceof ChildClass){
return child.value.equals(this.value);
}
return false;
}
}
输出结果
FatherClass.equals()
true
这个结果很好理解,child是father的一个子类,执行father.equals(FatherClass father)时,会调用父类的equals方法,子类参数会向上转型(FatherClass father = new ChildClass(String value)),返回true
我们修改一下代码:
public static void main(String[] args){
FatherClass father = new FatherClass("sd");
ChildClass child = new ChildClass("sd");
System.out.println(child.equals(father));
}
FatherClass.equals()
true
唯一出问题的地方就是参数,子类中的equals 参数是子类,而调用时的参数是父类,与刚才那种情况相反,而父类是不能自动去向下转型,因为对于父类而言,子类很神秘
那为什么转去调用父类的方法去了?我们可以看到父类的equal方法是public的,也就是说子类是继承了父类的这个方法,也就是说子类拥有了两个equals方法,只是参数不同,这样解释就比较清楚了。
那我们试一下把父类的equals方法改成private的,会出现什么情况
private boolean equals(FatherClass father){
System.out.println("FatherClass.equals()");
if(father == this){
return true;
}
if(father instanceof FatherClass){
return father.value.equals(this.value);
}
return false;
}
输出结果:
false
哪个都没调用,那去调用谁去了?Object类?看下Object类中的equals方法
public boolean equals(Object o) {
return this == o;
}
这就清楚了,Object只判断是否是同一个对象,所以返回了false
参考:http://blog.youkuaiyun.com/mouttz/article/details/12220839