Java 多态分析


Posted in Java/Android onApril 26, 2022

在结束继承内容之后便是多态,这同样也是面向对象程序的特性

有一点需要说明:为方便演示,所以我在一个java文件中定义了多个类,但实际上是不推荐这么做的

1.多态的概念

简单来讲就是不同的对象去完成同一个行为,但是产生了不同的状态

一个很简单的例子:学校某个班级的学生参加同一场考试,考试结束后不同的学生的考试成绩都是不同的,有的不及格、有的在及格线上游走、而有的则是高分,那么你在哪个水平~( ̄▽ ̄)~

要实现多态是需要条件的,具体条件如下:

1.必须在继承体系下,且发生了向上转型

2.子类要对父类的方法进行重写

3.通过父类的引用调用重写方法

上述涉及的一些新的概念,下面会详细介绍

2.向上转型

2.1概念

我们对前文所写的类进行一下修改:

class Plant {
    String name;
    String source;
    String genu;
    public void func() {
        System.out.println("父类方法");
    }
}
class Tree extends Plant {
 
    public void trait() {
        System.out.println("子类方法");
    }
}

所谓向上转型就是创建一个子类对象,将其当成父类来进行使用

具体操作如下:

Plant tree=new Tree();

因为是当成父类来使用,所以此时tree便不能调用子类的方法

Java 多态分析

Java中有向下转型,但因为向下转型不安全,所以就略过

2.2常见的向上转型的形式

上述例子中是第一种:直接赋值

除此以外还有两种形式

作为方法的参数

Java 多态分析

 作为方法的返回值

Java 多态分析

3.重写

即子类对父类的方法进行重新编写,此方法不能是构造方法,也不能被private、final以及static修饰,而我们重写的是方法里面的内容,方法的方法名、返回值和参数都不能修改

依旧是对类进行修改:

class Plant {
    String name;
    String source;
    String genu;
    public void trait() {
        System.out.println("父类方法");
    }
}
class Tree extends Plant {
    @Override  //注解,此注解可以进行一些合法性校验
    public void trait() {
        System.out.println("子类方法");
    }
}

我们向上转型后看看调用trait的结果是什么:

Java 多态分析

调用的是子类的方法,而这也是重写的特点

其实在编译的时候,调用的确实是父类的方法,但重写的方法是在执行阶段才确定调用哪个方法(即动态绑定)这也是重写和重载之间本质的区别 

3.1重写的注意事项

1.static、final、private修饰的方法以及构造方法不能重写

2.子类方法的访问权限要大于等于父类

3.在JDK7之后,重写的方法返回值类型可以不同,但必须具有父子关系,这属于协变类型

4.不要在构造方法中调用重写的方法

最后一点单独说明:假设父类的构造方法调用了重写的方法,因为子类的构造方法会首先调用父类构造方法,所以在子类对象还没有完全构造完成的时候就已经动态绑定调用了重写的方法,这种情况下程序出现问题的几率会大大增加

在了解完向上转型和重写之后业基本知道Java中是如何实现多态的:在继承体系下结合向上转型和重写实现多态

多态的内容结束,完

到此这篇关于Java由浅入深分析多态的概念的文章就介绍到这了!

Java/Android 相关文章推荐
SpringBoot项目中控制台日志的保存配置操作
Jun 18 Java/Android
详解SpringBoot异常处理流程及原理
Jun 21 Java/Android
死磕 java同步系列之synchronized解析
Jun 28 Java/Android
Java基础之详解HashSet的使用方法
Jun 30 Java/Android
SpringBoot快速入门详解
Jul 21 Java/Android
Java 在线考试云平台的实现
Nov 23 Java/Android
Java tomcat手动配置servlet详解
Nov 27 Java/Android
alibaba seata服务端具体实现
Feb 24 Java/Android
关于Mybatis中SQL节点的深入解析
Mar 19 Java/Android
java后台调用接口及处理跨域问题的解决
Mar 24 Java/Android
Spring中的@Transactional的工作原理
Jun 05 Java/Android
SpringBoot详解整合Redis缓存方法
Jul 15 Java/Android
Java由浅入深通关抽象类与接口(下篇)
Java由浅入深通关抽象类与接口(上篇)
Mybatis-Plus 使用 @TableField 自动填充日期
Apr 26 #Java/Android
Java 写一个简单的图书管理系统
Apr 26 #Java/Android
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
Apr 24 #Java/Android
Spring Boot 使用 Spring-Retry 进行重试框架
Apr 24 #Java/Android
Android在Sqlite3中的应用及多线程使用数据库的建议
Apr 24 #Java/Android
You might like
Php 构造函数construct的前下划线是双的_
2009/12/08 PHP
php中定义网站根目录的常用方法
2010/08/08 PHP
php 地区分类排序算法
2013/07/01 PHP
thinkphp模板的包含与渲染实例分析
2014/11/26 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
贴近用户体验的Jquery日期、时间选择插件
2015/08/19 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
2016/08/17 Javascript
有关文件上传 非ajax提交 得到后台数据问题
2016/10/12 Javascript
Nodejs高扩展性的模板引擎 functmpl简介
2017/02/13 NodeJs
vue的基本用法与常见指令
2017/08/15 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
2018/03/01 Javascript
angularjs 缓存的使用详解
2018/03/19 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
浅谈监听单选框radio改变事件(和layui中单选按钮改变事件)
2019/09/10 Javascript
[00:47]TI7不朽珍藏III——沙王不朽展示
2017/07/15 DOTA
Python自动调用IE打开某个网站的方法
2015/06/03 Python
Python实现把数字转换成中文
2015/06/29 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
python实现单向链表详解
2018/02/08 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
jupyter notebook插入本地图片的实现
2020/04/13 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
Python collections模块的使用方法
2020/10/09 Python
CSS3混合模式mix-blend-mode/background-blend-mode简介
2018/03/15 HTML / CSS
BISSELL官网:北美吸尘器第一品牌
2019/03/14 全球购物
汽车运用工程毕业生自荐信
2013/10/29 职场文书
领导干部廉政承诺书
2014/03/27 职场文书
管理标语大全
2014/06/24 职场文书
教师个人读书活动总结
2014/07/08 职场文书
医学专业大学生求职信
2014/07/12 职场文书
四风问题查摆材料
2014/08/25 职场文书
爱心募捐感谢信
2015/01/22 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
Python 数据可视化之Matplotlib详解
2021/11/02 Python