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 数组内置函数toArray详解
Jun 28 Java/Android
Java基础之this关键字的使用
Jun 30 Java/Android
java基础——多线程
Jul 03 Java/Android
Java中CyclicBarrier和CountDownLatch的用法与区别
Aug 23 Java/Android
springboot中的pom文件 project报错问题
Jan 18 Java/Android
Java9新特性对HTTP2协议支持与非阻塞HTTP API
Mar 16 Java/Android
Android超详细讲解组件ScrollView的使用
Mar 31 Java/Android
Java中API的使用方法详情
Apr 06 Java/Android
mybatis 获取更新记录的id
May 20 Java/Android
Spring中的@Transactional的工作原理
Jun 05 Java/Android
Java 中的 Lambda List 转 Map 的多种方法详解
Jul 07 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
MySQL数据源表结构图示
2008/06/05 PHP
php中的PHP_EOL换行符详细解析
2013/10/26 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
PHP实现无限分类的实现方法
2016/11/14 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
HTTP状态代码以及定义(解释)
2007/02/02 Javascript
Html中JS脚本执行顺序简单举例说明
2010/06/19 Javascript
jquery 查找select ,并触发事件的实现代码
2011/03/30 Javascript
javascript多行字符串的简单实现方式
2015/05/04 Javascript
jQuery预加载图片常用方法
2015/06/15 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
JavaScript使用delete删除数组元素用法示例【数组长度不变】
2017/01/17 Javascript
js实现适合新闻类图片的轮播效果
2017/02/05 Javascript
js实现鼠标拖动功能
2017/03/20 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
小程序如何构建骨架屏
2019/05/29 Javascript
[02:16]DOTA2超级联赛专访Burning 逆袭需要抓住机会
2013/06/24 DOTA
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
html5 css3实例教程 一款html5和css3实现的小机器人走路动画
2014/10/20 HTML / CSS
HTML5页面嵌入小程序没有返回按钮及返回页面空白的问题
2020/05/28 HTML / CSS
C#基础面试题
2016/10/17 面试题
奠基仪式主持词
2014/03/20 职场文书
篝火晚会主持词
2014/03/25 职场文书
村班子对照检查材料
2014/08/18 职场文书
承诺保证书格式
2015/02/28 职场文书
南极大冒险观后感
2015/06/05 职场文书
tensorflow+k-means聚类简单实现猫狗图像分类的方法
2021/04/28 Python
Pytorch可视化的几种实现方法
2021/06/10 Python
Python实现排序方法常见的四种
2021/07/15 Python
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android
python lambda 表达式形式分析
2022/04/03 Python