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 相关文章推荐
Java 将PPT幻灯片转为HTML文件的实现思路
Jun 11 Java/Android
idea搭建可运行Servlet的Web项目
Jun 26 Java/Android
Springboot使用Spring Data JPA实现数据库操作
Jun 30 Java/Android
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
Jul 01 Java/Android
Java面试题冲刺第十九天--数据库(4)
Aug 07 Java/Android
Java异常处理try catch的基本用法
Dec 06 Java/Android
Android基于Fresco实现圆角和圆形图片
Apr 01 Java/Android
Dubbo+zookeeper搭配分布式服务的过程详解
Apr 03 Java/Android
零基础学java之带参数以及返回值的方法
Apr 10 Java/Android
Spring Boot配合PageHelper优化大表查询数据分页
Apr 20 Java/Android
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
Jun 01 Java/Android
OpenFeign实现远程调用
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
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
浅谈php冒泡排序
2014/12/30 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
2015/06/24 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
PHP中Http协议post请求参数
2015/11/02 PHP
yii2 在控制器中验证请求参数的使用方法
2019/06/19 PHP
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
2013/06/05 Javascript
文本框回车提交与禁止提交示例
2013/09/27 Javascript
jQuery实现下拉框左右选择的简单实例
2014/02/22 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
Node.js异步I/O学习笔记
2014/11/04 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
2016/12/23 Javascript
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
详解vue-cli + webpack 多页面实例配置优化方法
2017/07/13 Javascript
jQuery实现弹窗下底部页面禁止滑动效果
2017/12/19 jQuery
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
elementUI select组件value值注意事项详解
2019/05/29 Javascript
vue+elementui 对话框取消 表单验证重置示例
2019/10/29 Javascript
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
python实现从网络下载文件并获得文件大小及类型的方法
2015/04/28 Python
python模拟Django框架实例
2016/05/17 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
opencv python 2D直方图的示例代码
2018/07/20 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
利用CSS3实现圆角的outline效果的教程
2015/06/05 HTML / CSS
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
秋季校运动会广播稿
2014/02/23 职场文书
《画风》教学反思
2014/04/16 职场文书
工商局局长个人对照检查材料思想汇报
2014/09/23 职场文书
小学四年级学生评语
2014/12/26 职场文书
出纳岗位职责
2015/01/31 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
MySQL 存储过程的优缺点分析
2021/05/20 MySQL