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 26 Java/Android
图解排序算法之希尔排序Java实现
Jun 26 Java/Android
Spring中的使用@Async异步调用方法
Nov 01 Java/Android
Mybatis是这样防止sql注入的
Dec 06 Java/Android
SpringDataJPA实体类关系映射配置方式
Dec 06 Java/Android
Java中try catch处理异常示例
Dec 06 Java/Android
spring cloud eureka 服务启动失败的原因分析及解决方法
Mar 17 Java/Android
RestTemplate如何通过HTTP Basic Auth认证示例说明
Mar 17 Java/Android
MyBatis配置文件解析与MyBatis实例演示
Apr 07 Java/Android
Spring Boot 实现 WebSocket
Apr 30 Java/Android
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
Jul 15 Java/Android
spring boot实现文件上传
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
Dedecms V3.1 生成HTML速度的优化办法
2007/03/18 PHP
php 向访客和爬虫显示不同的内容
2009/11/09 PHP
解析PHP跨站刷票的实现代码
2013/06/18 PHP
php站内搜索关键词变亮的实现方法
2014/12/30 PHP
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
日历查询的算法 如何计算某一天是星期几
2012/12/12 Javascript
javascript中怎么做对象的类型判断
2013/11/11 Javascript
浅谈Javascript 数组与字典
2015/01/29 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
Jquery注册事件实现方法
2015/05/18 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
Node.js中使用socket创建私聊和公聊聊天室
2015/11/19 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
jquery 属性选择器(匹配具有指定属性的元素)
2016/09/06 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
2017/07/27 Javascript
js中el表达式的使用和非空判断方法
2018/03/28 Javascript
基于jquery实现左右上下移动效果
2018/05/02 jQuery
vue点击当前路由高亮小案例
2019/09/26 Javascript
微信小程序点击列表跳转到对应详情页过程解析
2019/09/26 Javascript
js实现图片粘贴到网页
2019/12/06 Javascript
前端vue+elementUI如何实现记住密码功能
2020/09/20 Javascript
Python正则表达式实现截取成对括号的方法
2017/01/06 Python
python实现比较文件内容异同
2018/06/22 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
pow在python中的含义及用法
2019/07/11 Python
简单了解Django ORM常用字段类型及参数配置
2020/01/07 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
python 基于PYMYSQL使用MYSQL数据库
2020/12/24 Python
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
戴森英国官网:Dyson英国
2019/05/07 全球购物
个人授权委托书
2014/09/15 职场文书
《微笑着面对生活》优秀演讲稿范文
2014/09/23 职场文书
少先大队干部竞选稿
2015/11/20 职场文书
python中super()函数的理解与基本使用
2021/08/30 Python