含义:
1、协变类型返回也是覆盖方法的一种,jdk5开始支持的一种:子类覆盖方法返回可以是子类返回的子类,这个比较拗口
2、Java5.0放宽了这一限制,只要子类方法与超类方法具有相同的方法签名,或者子类方法的返回值是超类方法的子类型,就可以覆盖。
代码实例:(https://blog.csdn.net/huangwenyi1010/article/details/53454542)
public class Ay {
public static void main(String[] args) {
Person person = new Boy();
Flower flower = person.buy();
flower.like();
//! flower.love(); 编译错误
//因为是协变返回类型,所以可以向下转型
//这里RoseFlower是Flower的子类,
RoseFlower roseFlower = (RoseFlower) person.buy();
//可以调用like方法
roseFlower.like();
//可以调用love方法,与 “! flower.love();编译错误” 做对比
roseFlower.love();
}
}
class Person{
public Flower buy(){
System.out.println("Flower...in Person");
return new Flower();
}
}
/**
* 男孩
*/
class Boy extends Person{
/**
* 这里覆盖Person类的buy
* @return
*/
@Override
public RoseFlower buy(){
System.out.println("RoseFlower...in Boy");
//注意这里,这里就是协变返回类型
//导出类**(子类)覆盖(即重写)**基类**(父类)方法时,
//返回的类型可以是基类方法返回类型的子类
//这里 Boy -->Person
// RoseFlower -->Flower
//所以子类型的返回类型也可以是子类型的意思,因此“协变了”
return new RoseFlower();
}
}
class Flower{
/**
* 让普通人喜欢
*/
public void like(){
System.out.println("like in Flower");
}
}
class RoseFlower extends Flower{
/**
* 让女孩喜欢
*/
public void love(){
System.out.println("love..in RoseFlower");
}
}