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 相关文章推荐
浅析NIO系列之TCP
Jun 15 Java/Android
浅谈Python魔法方法
Jun 28 Java/Android
elasticSearch-api的具体操作步骤讲解
Jun 28 Java/Android
Java数组与堆栈相关知识总结
Jun 29 Java/Android
springboot项目以jar包运行的操作方法
Jun 30 Java/Android
Java中多线程下载图片并压缩能提高效率吗
Jul 01 Java/Android
Java8中Stream的一些神操作
Nov 02 Java/Android
SpringCloud Function SpEL注入漏洞分析及环境搭建
Apr 08 Java/Android
MyBatis核心源码深度剖析SQL语句执行过程
May 20 Java/Android
Android Studio实现简易进制转换计算器
May 20 Java/Android
Android基础入门之dataBinding的简单使用教程
Jun 21 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
javascript-简单的日历实现及Date对象语法介绍(附图)
2013/05/30 Javascript
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
jQuery图片特效插件Revealing实现拉伸放大
2015/04/22 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
JavaScript调试的多个必备小Tips
2017/01/15 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
jQuery实现键盘回车搜索功能
2017/07/25 jQuery
bootstrap select下拉搜索插件使用方法详解
2017/11/23 Javascript
详解vue2.0 不同屏幕适配及px与rem转换问题
2018/02/23 Javascript
vue通过style或者class改变样式的实例代码
2018/10/30 Javascript
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
2019/02/02 NodeJs
JavaScript设计模式之门面模式原理与实现方法分析
2020/03/09 Javascript
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
[02:53]DOTA2亚洲邀请赛 NewBee战队巡礼
2015/02/03 DOTA
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
python脚本替换指定行实现步骤
2017/07/11 Python
对numpy中轴与维度的理解
2018/04/18 Python
使用python的pandas为你的股票绘制趋势图
2019/06/26 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
使用django和vue进行数据交互的方法步骤
2019/11/11 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
HTML5有哪些新特征
2015/12/01 HTML / CSS
亚洲领先的设计购物网站:Pinkoi
2020/11/26 全球购物
C语言基础笔试题
2013/04/27 面试题
《蜗牛》教学反思
2014/02/18 职场文书
高二学生评语大全
2014/04/25 职场文书
质量安全标语
2014/06/07 职场文书
庆祝国庆节标语
2014/10/09 职场文书
本科毕业论文致谢词
2015/05/14 职场文书
读《方与圆》有感:交友方圆有度
2020/01/14 职场文书
Python+Appium新手教程
2021/04/17 Python
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js