李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
协变返回类型
Leefs
2019-10-15 AM
1768℃
0条
# 协变返回类型 ### 前言 一个菜鸟对《Java编程思想》的探索之路。 ### 1.概念理解 Java SE5中添加了协变返回类型,它表示在导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型。 ----- 上方是《Java编程思想》的原文,第一遍读的时候是不是感觉很绕...... 意思就是: 子类中的成员函数的返回值类型不必严格等同于父类中被重写的成员函数的返回值类型,而可以是更 "狭窄" 的类型 。也就是允许返回更为具体的类型 。 ### 2.代码 > 下面我们用一个示例来更深的理解: ```java public class CovarianReturn { /** * @param args */ public static void main(String[] args) { Mill m=new Mill(); Grain g=m.process(); System.out.println(g); m=new WheatMill(); g=m.process(); System.out.println(g); } } class Grain{ 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{ Wheat process(){ return new Wheat(); } } ``` 输出结果: ```java Grain wheat ``` (本例来自 Thinking in Java p164 ) > 下面我们来分析一下这段代码的执行过程: 1. 1.创建**Mill**对象在堆内存中为Mill分配内存空间 2. 2.调用**Mill**类中的**process**方法,在**process**方法中返回一个**Grain**对象。 3. 3.**System.out.println(g);**调用了Grain中的toString()方法,相当于g.toString(),输出**Grain** 4. 4.**m=new WheatMill();**向上转型,创建子类对象。 5. 5.**g=m.process();**调用导出类WheatMill中重写基类Mill的process()方法,*注意此时的返回类型为Wheat相对与基类返回类型更加的具体。*同时,返回一个**Wheat**对象。 6. 6.**System.out.println(g);**调用Wheat类中的toString()方法,输出**wheat** Java SE5与Java较早版本之间的主要差异就是较早的版本将强制**process()**的覆盖版本必须返回**Grain**,而不能返回**Wheat**,尽管**Wheat**是从**Grain**导出的,因而也应该是一种合法的返回类型。协变返回类型允许返回更具体的**Wheat**类型。 ----- #### 通过上方代码和分析是不是对协变返回类型中的概念有一个更好的理解
标签:
Java
,
Java编程思想
,
JavaSE
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/12.html
上一篇
构造器内部多态方法的行为
下一篇
用继承进行设计
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
gorm
MyBatisX
JavaWEB项目搭建
查找
Flink
FastDFS
数据结构
排序
Java工具类
Netty
SQL练习题
Shiro
Livy
FileBeat
Spark
Golang
JVM
线程池
Git
MyBatis-Plus
ClickHouse
序列化和反序列化
Jenkins
设计模式
Zookeeper
机器学习
前端
RSA加解密
Beego
GET和POST
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭