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 相关文章推荐
Spring Data JPA使用JPQL与原生SQL进行查询的操作
Jun 15 Java/Android
Spring Cache和EhCache实现缓存管理方式
Jun 15 Java/Android
springboot利用redis、Redisson处理并发问题的操作
Jun 18 Java/Android
Java elasticsearch安装以及部署教程
Jun 28 Java/Android
每日六道java新手入门面试题,通往自由的道路
Jun 30 Java/Android
springboot临时文件存储目录配置方式
Jul 01 Java/Android
Springboot配置suffix指定mvc视图的后缀方法
Jul 03 Java/Android
Java使用jmeter进行压力测试
Jul 09 Java/Android
Spring Boot 排除某个类加载注入IOC的操作
Aug 02 Java/Android
Spring依赖注入多种类型数据的示例代码
Mar 31 Java/Android
JavaScript正则表达式实现注册信息校验功能
May 30 Java/Android
使用Postman测试需要授权的接口问题
Jun 21 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+MySQL 制作简单的留言本
2009/11/02 PHP
PHP中计算字符串相似度的函数代码
2012/12/29 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
PHP中的随机性 你觉得自己幸运吗?
2016/01/22 PHP
PHP7如何开启Opcode打造强悍性能详解
2018/05/11 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
PHP rsa加密解密算法原理解析
2020/12/09 PHP
HTTP头隐藏PHP版本号实现过程解析
2020/12/09 PHP
jQuery焦点图切换特效插件封装实例
2013/08/18 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
2016/07/18 Javascript
javascript实现的上下无缝滚动效果
2016/09/19 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
2016/10/12 Javascript
jquery实现图片切换代码
2016/10/13 Javascript
在JS中a标签加入单击事件屏蔽href跳转页面
2016/12/16 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
jQuery超简单遮罩层实现方法示例
2018/09/06 jQuery
js实现磁性吸附的示例
2020/10/26 Javascript
vant中的toast轻提示实现代码
2020/11/04 Javascript
Python使用win32com实现的模拟浏览器功能示例
2017/07/13 Python
在Python中执行系统命令的方法示例详解
2017/09/14 Python
pandas对指定列进行填充的方法
2018/04/11 Python
Python3中的列表生成式、生成器与迭代器实例详解
2018/06/11 Python
python调用百度语音REST API
2018/08/30 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
2018/11/06 Python
Python描述符descriptor使用原理解析
2020/03/21 Python
python 制作网站小说下载器
2021/02/20 Python
博士研究生自我鉴定范文
2013/12/04 职场文书
黄河的主人教学反思
2014/02/07 职场文书
营销总监岗位职责范本
2014/02/26 职场文书
预备党员入党自我评价范文
2014/03/10 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
组织委员竞选稿
2015/11/21 职场文书
Python基础之操作MySQL数据库
2021/05/06 Python
python使用shell脚本创建kafka连接器
2022/04/29 Python
源码安装apache脚本部署过程详解
2022/09/23 Servers