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 将PPT幻灯片转为HTML文件的实现思路
Jun 11 Java/Android
浅谈@Value和@Bean的执行顺序问题
Jun 16 Java/Android
swagger如何返回map字段注释
Jul 03 Java/Android
spring cloud gateway中如何读取请求参数
Jul 15 Java/Android
java设计模式--三种工厂模式详解
Jul 21 Java/Android
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
Dec 06 Java/Android
SpringBoot+Redis实现布隆过滤器的示例代码
Mar 17 Java/Android
Java实现二分搜索树的示例代码
Mar 17 Java/Android
Spring Boot 使用 Spring-Retry 进行重试框架
Apr 24 Java/Android
Java 轮询锁使用时遇到问题
May 11 Java/Android
Android开发手册自定义Switch开关按钮控件
Jun 10 Java/Android
Android移动应用开发指南之六种布局详解
Sep 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抓取并保存网站图片的实现代码
2015/10/28 PHP
PHP使用第三方即时获取物流动态实例详解
2017/04/27 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
CI框架(CodeIgniter)操作redis的方法详解
2018/01/25 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
2020/01/26 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
JavaScript常用脚本汇总(二)
2015/03/04 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
使用jquery获取url及url参数的简单实例
2016/06/14 Javascript
微信小程序入门教程
2016/11/18 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
JS实现的简单图片切换功能示例【测试可用】
2017/02/14 Javascript
vue实现div拖拽互换位置
2020/07/29 Javascript
JS实现判断有效的数独算法示例
2019/02/25 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
[04:54]DOTA2-DPC中国联赛1月31日Recap集锦
2021/03/11 DOTA
Python中用函数作为返回值和实现闭包的教程
2015/04/27 Python
Python中return语句用法实例分析
2015/08/04 Python
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
python json.dumps中文乱码问题解决
2020/04/01 Python
英国虚拟主机服务商:eUKhost
2016/08/16 全球购物
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
德国知名健康零食网上商店:Seeberger
2017/07/27 全球购物
中国专业的音频分享平台:喜马拉雅
2019/05/24 全球购物
俄罗斯一家时尚女装商店:Charuel
2019/12/04 全球购物
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
params有什么用
2016/03/01 面试题
可贵的沉默教学反思
2014/02/06 职场文书
师德师风建设整改措施思想汇报
2014/10/11 职场文书
2014年超市员工工作总结
2014/11/18 职场文书
校长师德表现自我评价
2015/03/05 职场文书
聚众斗殴罪辩护词
2015/05/21 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP