重写值得注意的一个细节

class Ding{
	public String toString(){
		return "Ding";
	}
}
class Grain extends Ding{
	public String toString(){
		return "Grain";
	}
}
class Wheat extends Grain{
	public String toString(){
		return "Wheat";
	}
}
/***********************/
class Mill{
	Grain process(){
		return new Grain();
	}
}
class WheatMill extends Mill{
	@Override
	Wheat process(){
		return new Wheat();
	}
}
public class CovariantReturn {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Mill mill = new Mill();
		Ding g = mill.process();
		System.out.println(g.toString());
		
		mill = new WheatMill();
		g = mill.process();
		System.out.println(g.toString());
	}

}

注:WheatMill 类重写了Mill 类的process方法。但是这个重写和我们之前接触的重写又有些不同。仔细看可以发现子类重写父类的方法的返回类型和父类的方法的返回类型是不一样的。但是两个返回类型也存在着关系:即子类方法的返回类型是父类方法返回类型的子类。这里其实就是JDK的新特性了。我们之前关于重写的概念是:子类重写父类的方法,方法名,返回类类型,参数列表都要相同。从JDK5以后就允许子类冲重写父类方法的返回类型可以是父类方法的返回类型的子类了。具体有什么好处,呵呵,说不上来。不过这样更能说明多态了。

你可能感兴趣的:(jdk)