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实战之用Swing实现通讯录管理系统
Jun 13 Java/Android
Java常用工具类汇总 附示例代码
Jun 26 Java/Android
深入理解java.lang.String类的不可变性
Jun 27 Java/Android
总结Java对象被序列化的两种方法
Jun 30 Java/Android
springboot临时文件存储目录配置方式
Jul 01 Java/Android
新手初学Java网络编程
Jul 07 Java/Android
详细了解java监听器和过滤器
Jul 09 Java/Android
dubbo集成zipkin获取Traceid的实现
Jul 26 Java/Android
Dubbo+zookeeper搭配分布式服务的过程详解
Apr 03 Java/Android
java如何实现获取客户端ip地址的示例代码
Apr 07 Java/Android
SpringCloud超详细讲解Feign声明式服务调用
Jun 21 Java/Android
app场景下uniapp的扫码记录
Jul 23 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
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
如何通过Linux命令行使用和运行PHP脚本
2015/07/29 PHP
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
Nigma vs Alliance BO5 第五场2.14
2021/03/10 DOTA
jQuery中andSelf()方法用法实例
2015/01/08 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
Javascript中浏览器窗口的基本操作总结
2016/08/18 Javascript
AngularJs Scope详解及示例代码
2016/09/01 Javascript
jQuery获取选中单选按钮radio的值
2016/12/27 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
基于jquery实现五星好评
2017/11/18 jQuery
使用Vue写一个datepicker的示例
2018/01/27 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
深入浅析ng-bootstrap 组件集中 tabset 组件的实现分析
2019/07/19 Javascript
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
[01:04:14]OG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python进阶教程之模块(module)介绍
2014/08/30 Python
Python实现备份文件实例
2014/09/16 Python
python 顺时针打印矩阵的超简洁代码
2018/11/14 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
django 微信网页授权登陆的实现
2019/07/30 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
django认证系统实现自定义权限管理的方法
2019/08/28 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
SHEIN美国:购买时髦的女性服装
2020/12/02 全球购物
劳资人员岗位职责
2013/12/19 职场文书
优秀的茶餐厅创业计划书
2014/01/03 职场文书
南湾猴岛导游词
2015/02/09 职场文书
房屋质量投诉书
2015/07/02 职场文书
六一亲子活动感想
2015/08/07 职场文书
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL
Elasticsearch 配置详解
2022/04/19 Java/Android