代码学习—继承理解

代码学习—继承理解

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


和原来一样,有点奇怪,明明子类调用equal的方法,为何却去调用了父类的equals方法?

唯一出问题的地方就是参数,子类中的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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值