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 23 Java/Android
SpringBoot实现quartz定时任务可视化管理功能
Aug 30 Java/Android
聊聊SpringBoot自动装配的魔力
Nov 17 Java/Android
Java中Quartz高可用定时任务快速入门
Apr 03 Java/Android
Spring Data JPA框架自定义Repository接口
Apr 28 Java/Android
带你了解Java中的ForkJoin
Apr 28 Java/Android
Java死锁的排查
May 11 Java/Android
springcloud整合seata
May 20 Java/Android
Java界面编程实现界面跳转
Jun 16 Java/Android
Android RecyclerView实现九宫格效果
Jun 28 Java/Android
Java 中的 Lambda List 转 Map 的多种方法详解
Jul 07 Java/Android
app场景下uniapp的扫码记录
Jul 23 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多线程下载远程多个文件
2013/06/25 PHP
使用HMAC-SHA1签名方法详解
2013/06/26 PHP
CI框架中site_url()和base_url()的区别
2015/01/07 PHP
typecho插件编写教程(六):调用接口
2015/05/28 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
JavaScript XML操作 封装类
2009/07/01 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
jQuery响应鼠标事件并隐藏与显示input默认值
2014/08/24 Javascript
js对象继承之原型链继承实例
2015/01/10 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
jQuery grep()方法详解及实例代码
2016/10/30 Javascript
Angular2自定义分页组件
2017/04/19 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
[12:29]《一刀刀一天》之DOTA全时刻19:蝙蝠骑士田伯光再度不举
2014/06/10 DOTA
Python实现提取文章摘要的方法
2015/04/21 Python
图文详解WinPE下安装Python
2016/05/17 Python
Python排序搜索基本算法之希尔排序实例分析
2017/12/09 Python
win7+Python3.5下scrapy的安装方法
2018/07/31 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
python numpy 按行归一化的实例
2019/01/21 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
2019/08/20 Python
在python image 中安装中文字体的实现方法
2019/08/22 Python
Django框架创建项目的方法入门教程
2019/11/04 Python
Python彻底删除文件夹及其子文件方式
2019/12/23 Python
三星俄罗斯授权在线商店:Samsung俄罗斯
2019/09/28 全球购物
一些网络技术方面的面试题
2014/05/01 面试题
禁毒宣传活动总结
2014/08/26 职场文书
城市规划应届生推荐信
2014/09/08 职场文书
常务副县长“四风”个人对照检查材料思想汇报
2014/10/02 职场文书
致接力运动员加油稿
2015/07/21 职场文书
学困生转化工作总结
2015/08/13 职场文书
《家庭教育》读后感3篇
2019/12/18 职场文书