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 Cache和EhCache实现缓存管理方式
Jun 15 Java/Android
Spring Boot 启动、停止、重启、状态脚本
Jun 26 Java/Android
elasticSearch-api的具体操作步骤讲解
Jun 28 Java/Android
java解析XML详解
Jul 09 Java/Android
SpringBoot SpringEL表达式的使用
Jul 25 Java/Android
java中用float时,数字后面加f,这样是为什么你知道吗
Sep 04 Java/Android
Java中的继承、多态以及封装
Apr 11 Java/Android
Spring Data JPA框架自定义Repository接口
Apr 28 Java/Android
Java 定时任务技术趋势简介
May 04 Java/Android
Java中的Kotlin 内部类原理
Jun 16 Java/Android
前端与RabbitMQ实时消息推送未读消息小红点实现示例
Jul 23 Java/Android
SpringBoot Http远程调用的方法
Aug 14 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函数
2008/10/03 PHP
php中模拟POST传递数据的两种方法分享
2011/09/16 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
2016/03/18 PHP
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
2013/11/05 Javascript
Javascript四舍五入Math.round()与Math.pow()使用介绍
2013/12/27 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
详解JavaScript中的blink()方法的使用
2015/06/08 Javascript
初步使用Node连接Mysql数据库
2016/03/03 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
js实现多图左右切换功能
2016/08/04 Javascript
VueJS全面解析
2016/11/10 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
3分钟快速搭建nodejs本地服务器方法运行测试html/js
2017/04/01 NodeJs
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
Vue入门之数据绑定(小结)
2018/01/08 Javascript
JavaScript正则表达式函数总结(常用)
2018/02/22 Javascript
JS获取并处理php数组的方法实例分析
2018/09/04 Javascript
Jquery如何使用animation动画效果改变背景色的代码
2020/07/20 jQuery
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
[01:01:04]2018DOTA2亚洲邀请赛 4.5 淘汰赛 OpTic vs TNC 第一场
2018/04/06 DOTA
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
总结Python编程中函数的使用要点
2016/03/20 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
python字符串切割:str.split()与re.split()的对比分析
2019/07/16 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
2020/01/08 Python
python时间time模块处理大全
2020/10/25 Python
Python 2.6.6升级到Python2.7.15的详细步骤
2020/12/14 Python
html Table 表头固定的实现
2019/01/22 HTML / CSS
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
物流专业大学生求职信范文
2013/10/28 职场文书
后勤人员岗位职责
2013/12/17 职场文书
保险内勤岗位职责
2014/04/05 职场文书
小学语文课后反思精选
2014/04/25 职场文书
聘任书格式及范文
2015/09/21 职场文书
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript