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中的OPTIONAL
Jun 14 Java/Android
springboot利用redis、Redisson处理并发问题的操作
Jun 18 Java/Android
Java常用函数式接口总结
Jun 29 Java/Android
Java Kafka 消费积压监控的示例代码
Jul 01 Java/Android
SpringCloud之@FeignClient()注解的使用方式
Sep 25 Java/Android
springboot如何接收application/x-www-form-urlencoded类型的请求
Nov 02 Java/Android
SpringBoot+Redis实现布隆过滤器的示例代码
Mar 17 Java/Android
零基础学java之循环语句的使用
Apr 10 Java/Android
Android开发实现极为简单的QQ登录页面
Apr 24 Java/Android
Android存储中最基本的文件存储方式
Apr 30 Java/Android
Java实现添加条码或二维码到Word文档
Jun 01 Java/Android
Java实现简单小画板
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入门速成(2)
2006/10/09 PHP
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
PHP为表单获取的URL 地址预设 http 字符串函数代码
2010/05/26 PHP
Yii rules常用规则示例
2016/03/15 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
2016/12/12 PHP
PHP加MySQL消息队列深入理解
2021/02/27 PHP
任意位置显示html菜单
2007/02/01 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件
2011/12/21 Javascript
解决Jquery鼠标经过不停滑动的问题
2014/03/03 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
Bootstrap创建可折叠的组件
2016/02/23 Javascript
jquery html动态添加的元素绑定事件详解
2016/05/24 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
vue实现商品列表的添加删除实例讲解
2020/05/14 Javascript
Python sys.path详细介绍
2013/10/17 Python
Python定义一个跨越多行的字符串的多种方法小结
2018/07/19 Python
Python合并同一个文件夹下所有PDF文件的方法
2019/03/11 Python
Python3中urlencode和urldecode的用法详解
2019/07/23 Python
详解django中Template语言
2020/02/22 Python
各大浏览器 CSS3 和 HTML5 兼容速查表 图文
2010/04/01 HTML / CSS
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
世界著名的顶级牛排:Omaha Steak(奥马哈牛排)
2016/09/20 全球购物
Marc Jacobs彩妆官网:Marc Jacobs Beauty
2017/07/03 全球购物
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
Pandora德国官网:购买潘多拉手链、戒指、项链和耳环
2020/02/20 全球购物
师范学院教师自荐书
2014/01/31 职场文书
《小熊住山洞》教学反思
2014/02/21 职场文书
专业技术职务聘任书
2014/03/29 职场文书
购房意向书
2014/04/01 职场文书
常务副总经理岗位职责
2014/04/12 职场文书
物流专业自荐信
2014/05/23 职场文书
公安学专业求职信
2014/07/27 职场文书
党建工作整改措施
2014/10/28 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL