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 相关文章推荐
SpringBoot项目中控制台日志的保存配置操作
Jun 18 Java/Android
Spring Boot 实现敏感词及特殊字符过滤处理
Jun 29 Java/Android
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
Dec 06 Java/Android
SSM项目使用拦截器实现登录验证功能
Jan 22 Java/Android
关于EntityWrapper的in用法
Mar 22 Java/Android
零基础学java之带返回值的方法的定义和调用
Apr 10 Java/Android
Spring Data JPA框架Repository自定义实现
Apr 28 Java/Android
解决Springboot PostMapping无法获取数据的问题
May 06 Java/Android
Android Studio实现带三角函数对数运算功能的高级计算器
May 20 Java/Android
Java处理延时任务的常用几种解决方案
Jun 01 Java/Android
SpringBoot使用ip2region获取地理位置信息的方法
Jun 21 Java/Android
Java+swing实现抖音上的表白程序详解
Jun 25 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+AJAX聊天程序[聊天室]提供下载
2007/07/21 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
PHP递归调用数组值并用其执行指定函数的方法
2015/04/01 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
jquery常用方法及使用示例汇总
2014/11/08 Javascript
javascript中indexOf技术详解
2015/05/07 Javascript
JS+CSS实现简易实用的滑动门菜单效果
2015/09/18 Javascript
基于jQuery实现Accordion手风琴自定义插件
2020/10/13 Javascript
js模糊查询实例分享
2016/12/26 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
2018/07/11 Javascript
JQuery通过后台获取数据遍历到前台的方法
2018/08/13 jQuery
在weex中愉快的使用scss的方法步骤
2020/01/02 Javascript
js利用拖放实现添加删除
2020/08/27 Javascript
解决vue项目 build之后资源文件找不到的问题
2020/09/12 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
Python fileinput模块使用实例
2015/06/03 Python
python读取文本中数据并转化为DataFrame的实例
2018/04/10 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
python求最大值最小值方法总结
2019/06/25 Python
python实现大文本文件分割
2019/07/22 Python
Python 中由 yield 实现异步操作
2020/05/04 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
2020/05/24 Python
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
全球采购的街头服饰和帽子:Urban Excess
2020/10/28 全球购物
Oasis服装官网:时尚女装在线
2020/07/09 全球购物
中国文明网签名寄语
2014/01/18 职场文书
《桥》教学反思
2014/04/09 职场文书
新闻报道策划方案
2014/06/11 职场文书
十八大标语口号
2014/10/09 职场文书
高中生思想道德自我评价
2015/03/09 职场文书
大学组织委员竞选稿
2015/11/21 职场文书
毕业欢送晚会主持词
2019/06/25 职场文书