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在个人电脑上实现微信扫码支付
Jun 13 Java/Android
springcloud之Feign超时问题的解决
Jun 24 Java/Android
spring cloud 配置中心native配置方式
Sep 25 Java/Android
使用HttpSessionListener监听器实战
Mar 17 Java/Android
Java实现经典游戏泡泡堂的示例代码
Apr 04 Java/Android
MyBatis配置文件解析与MyBatis实例演示
Apr 07 Java/Android
Java 关于String字符串原理上的问题
Apr 07 Java/Android
Java由浅入深通关抽象类与接口(上篇)
Apr 26 Java/Android
Qt数据库应用之实现图片转pdf
Jun 01 Java/Android
Mybatis-plus配置分页插件返回统一结果集
Jun 21 Java/Android
SpringBoot详解执行过程
Jul 15 Java/Android
基于Android10渲染Surface的创建过程
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中的加密功能
2006/10/09 PHP
PHP随机数 C扩展随机数
2016/05/04 PHP
javascript 写类方式之五
2009/07/05 Javascript
jQuery实现的类flash菜单效果代码
2010/05/17 Javascript
关于hashchangebroker和statehashable的补充文档
2011/08/08 Javascript
Google官方支持的NodeJS访问API,提供后台登录授权
2014/07/29 NodeJs
javascript制作的cookie封装及使用指南
2015/01/02 Javascript
JavaScript中操作字符串小结
2015/05/04 Javascript
jQuery实现的淡入淡出二级菜单效果代码
2015/09/15 Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
2016/08/15 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
2017/01/05 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
webpack4 + react 搭建多页面应用示例
2018/08/03 Javascript
Jquery获取radio选中值实例总结
2019/01/17 jQuery
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
js对象属性名驼峰式转下划线的实例代码
2020/09/17 Javascript
Python中装饰器学习总结
2018/02/10 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
2018/12/05 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
2020/04/08 Python
python如何实现读取并显示图片(不需要图形界面)
2020/07/08 Python
如何把python项目部署到linux服务器
2020/08/26 Python
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
瑞士灯具购物网站:Lampenwelt.ch
2018/07/08 全球购物
手工制作的男士奢华英国鞋和服装之家:Goodwin Smith
2019/06/21 全球购物
应届大学生的推荐信
2013/11/20 职场文书
绿色学校实施方案
2014/03/31 职场文书
商务助理求职信范文
2014/04/20 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
2014年领导班子专项整治整改方案
2014/09/28 职场文书
作文评语集锦
2014/12/25 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
瞿秋白纪念馆观后感
2015/06/10 职场文书
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers
使用 Apache Dubbo 实现远程通信(微服务架构)
2022/02/12 Servers