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用自带的Image IO给图片添加水印
Jun 15 Java/Android
springboot临时文件存储目录配置方式
Jul 01 Java/Android
Java使用httpRequest+Jsoup爬取红蓝球号码
Jul 02 Java/Android
Spring Cloud Gateway去掉url前缀
Jul 15 Java/Android
java设计模式--三种工厂模式详解
Jul 21 Java/Android
java设计模式--七大原则详解
Jul 21 Java/Android
logback如何自定义日志存储
Aug 30 Java/Android
Java数据开发辅助工具Docker与普通程序使用方法
Sep 15 Java/Android
Flutter Navigator 实现路由传递参数
Apr 22 Java/Android
mybatis-plus模糊查询指定字段
Apr 28 Java/Android
Java实现带图形界面的聊天程序
Jun 10 Java/Android
解决spring.thymeleaf.cache=false不起作用的问题
Jun 10 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地址引用(php地址引用的效率问题)
2012/03/23 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
2013/06/25 PHP
php组合排序简单实现方法
2016/10/15 PHP
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
NiftyCube——轻松实现圆角边框
2007/02/20 Javascript
直接生成打开窗口代码,不必下载
2008/05/14 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
基于jQuery实现响应式圆形图片轮播特效
2015/11/25 Javascript
Bootstrap选项卡与Masonry插件的完美结合
2016/07/06 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
利用JQuery阻止事件冒泡
2016/12/01 Javascript
js实现符合国情的日期插件详解
2017/01/19 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
在 Angular 中实现搜索关键字高亮示例
2017/03/21 Javascript
Vue精简版风格概述
2018/01/30 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
2018/02/08 Javascript
Vue父组件如何获取子组件中的变量
2019/07/24 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
2020/02/14 Javascript
python实现忽略大小写对字符串列表排序的方法
2014/09/25 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
2016/06/02 Python
对python制作自己的数据集实例讲解
2018/12/12 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
python读取excel数据并且画图的实现示例
2021/02/08 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
公司JAVA开发面试题
2015/04/02 面试题
写出程序把一个链表中的接点顺序倒排
2014/04/28 面试题
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
初中生学习的自我评价
2013/11/14 职场文书
幼儿园英语教学反思
2014/01/30 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
教师“一帮一”结对子活动总结
2015/05/07 职场文书
爱心捐助活动总结
2015/05/09 职场文书
学前班教学反思
2016/02/24 职场文书
php中配置文件保存修改操作 如config.php文件的读取修改等操作
2021/05/12 PHP