【JavaSE】面向对象——多态性

news2024/11/25 7:01:21

多态性

多态性的概念

所谓多态性,理解为一个事物的多种形态。具体点就是去完成某个动作时,不同的对象会产生不同的状态。

多态性的好处

多态在Java中指的是父类的引用指向子类的对象,或者可以说是子类的对象赋给父类的引用。这样在我们的实际开发中,就可以使用不同子类的对象赋给相同的父类,在不改变代码结构的情况下,动态的扩展和切换对象的行为,使得代码更高效。

如何实现多态性

简而言之,就是父类的引用指向子类的对象   或者   子类的对象赋给父类的引用。

public class Animal {
    
}


public class Dog extends Animal{

}


public class Main {

    public static void main(String[] args) {
        Animal dog  = new Dog();
    }

}

实现原理

动态绑定

动态绑定,指的是在编译时期只知道变量的声明类型,但是无法确定实际的对象类型。在运行时,JVM会解析实际对象的类型。这意味着,直到运行时,才可以确定调用的实际方法。正是这种动态绑定机制,才使得多态成为可能。

静态绑定:在编译时期就可以确定所要调用的具体类型,且在运行时期保持不变。

虚方法调用

虚方法调用是在运行时根据实际对象的类型来确定要调用哪个方法的机制,而无法在编译时确定具体的调用方法。在多态的情况下,子类重写了父类的A方法,此时A方法就被称为虚方法,在运行时,虚拟机根据实际的子类对象,来动态调用属于子类的A方法。像A方法这样的方法在编译时是无法确定具体调用哪个方法,只有真正运行时才确定。

在多态的场景下,调用方法时:

编译时,认为是左边声明的父类类型的方法;

运行时,认为是右边声明的子类重写的方法。

简称为:编译看左边,运行看右边。

多态性的使用前提

1. 要有类的继承关系。

2. 方法重写,没有方法的重写也可以实现多态性,但是从多态性的现实意义来说,不重写方法的多态性是没有意义。

多态性的好处和弊端

好处

1. 开发中:使用父类做方法的形参,是多态使用最多的场合。即使增加了新的子类,方法也无需改变,提高了扩展性。

2. 多态无处不在,在后续的抽象类和接口中,本身是不能定义对象的,只有其的子类才能定义对象,这无疑是多态的体现。

3. 变量引用的子类对象不同,执行的方法就不同,实现动态绑定。代码编写更灵活、功能更强大,可维护性和扩展性更好了。

弊端

在多态的场景下,我们创建了子类的对象,在内存中加载了子类特有的方法和属性。但是由于声明为父类的引用,导致我们并没有办法调用子类特有的属性和方法。

多态的适用性

多态适用于方法,不适用于属性。

实现多态之后,如果直接调用属性,发现值是父类的;如果使用方法调用属性,发现值是子类的。其实,这就是静态绑定和动态绑定的问题了。

Java为了实现多态这个机制,选择让方法在运行时绑定对应的类型,属性在编译时期绑定对应的类型。因此,属性绑定的是父类的值,而方法绑定的是子类对象的值。

当直接调用属性时,调用到的是父类的属性,正是由于属性在编译期间绑定,而多态编译期间的变量是父类类型,因此绑定的就是父类的属性值。

当使用方法调用属性时,调用到的是子类的属性,使用super.属性除外。重写方法在运行期间确定对应的地址,也就是动态绑定。而使用子类的方法时,由于默认前边有this.,因此调用的就是子类的属性,这也正好说明了为啥调用super.除外。

所谓多态性,就是一个事物的多种状态,即不同的对象去完成相同的动作时会产生不同的状态。而我认为在实际开发中,多态的体现更多在接口和抽象类中,因为在大多数场景下,其实属性和未重写的方法并没有什么作用。利用抽象类和多态可以让在不修改代码结构的场景下,动态的扩展和切换对象的行为,从而使代码更高效。谈完多态的概念和实际开发场景,多态的实现原理也应该是一个比较重要的内容,其利用动态绑定和虚方法调用的底层实现,从而可以让多态称为现实。

重写属于动态多态,而重载属于静态多态。

向上转型 / 向下转型  

向上转型就是多态,而向下转型则是先通过向上转型之后,再向下强转。如下图:

 

2fc6a3c6868c427b830810681946b042.png

向上转型一般是不存在问题的,而向下转型就不一定了。由于Java的继承是单继承性,只有一个父类,但是一个父类却有很多子类。因此当向下转型时,我们就需要考虑可能会出现类型转换异常。建议在向下转型之前,使用instanceof关键字进行判断,避免出现类型转换异常。instanceof的使用格式是:对象名 instanceof 类名。对于instanceof来说,只要对象对应的类是该类的子类即可。 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1493436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CSS】关于文字的换行问题

给固定宽度的div中写入一些文字&#xff0c;你会发现文字可能会超出&#xff0c;实例如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&qu…

小白跟做江科大51单片机之AT24C02数据存储

1.导入Delay、key、LCD1602相关文件 2.控制逻辑 以I2C去写入&#xff0c;用AT24C02包装好&#xff0c;main调用即可 3.编写I2C代码 看着这六个状态编 图1 开和关 图2 发送一个字节 图3 接收一个字节 图4 接收和发送应答 #include <REGX52.H> sbit I2C_SCL P2^1; sbi…

2024年Java者未来的出路在哪里,java多线程面试

重要 大环境对于我们能力要求越来越高&#xff0c;医学专家又说今年冬天新冠肺炎将“席卷重来”。 如果疫情再次爆发&#xff0c;势必将再次影响企业的正常运作&#xff0c;一波裁员浪潮你又能否抗住&#xff1f; 不管如何&#xff0c;明年金三银四又是一波跳槽时机&#xf…

CUDA学习笔记04:向量之和

参考资料 CUDA编程模型系列二(向量操作)_哔哩哔哩_bilibili &#xff08;非常好的学习资料&#xff01;&#xff09; vs2019 随意新建一个空项目&#xff0c;按照之前的环境配置配好项目依赖&#xff1a; CUDA学习笔记02&#xff1a;测试程序hello world-CSDN博客 代码结构…

k倍区间c++

题目 输入样例&#xff1a; 5 2 1 2 3 4 5输出样例&#xff1a; 6 思路 本题默认所有读者已经理解了如何求前缀和。 可以利用双层循环分别枚举左端点和右端点即可枚举完所有区间&#xff0c;而对于每个区间&#xff0c;利用一维前缀和判断它是否是一个k倍区间&#xff0c;是…

必看内容!物联网ESP8266与阿里云物联网平台通信

一、硬件连接 wifi模块ESP8266-01S接线&#xff1a; TXD接RXD&#xff08;USB&#xff09; RXD接TXD (USB) VCC接3.3V GNDGPIO0接地 二、调试工具 三、烧录MQTT固件 购买的ESP8266一般没带MQTT固件&#xff0c;所以无法通过MQTT指令与云平台通信&#xff0c;需要烧录固件。 …

1、Linux-安装

一、Linux和Windows的一些区别 1、Linux严格区分大小写——【Windows创建文件夹时不区分大小写】 2、Linux中所有内容都以文件形式存储&#xff0c;包括硬件 3、Linux不靠拓展名区分文件类型&#xff0c;而是可以通过读取文件开头的一些字节来区分。 但是在实际使用中一般要…

C#,电话数字键盘问题(Mobile Numeric Keypad problem)的算法与源代码

1 电话数字键盘问题 提供移动数字键盘。您只能按向上、向左、向右或向下至当前按钮的按钮。不允许您按最下面一行的角点按钮&#xff08;即.*和#&#xff09;。 移动键盘 给定一个数N&#xff0c;找出给定长度的可能数。 示例&#xff1a; 对于N1&#xff0c;可能的数字数为…

Guava处理异常

guava由Google开发&#xff0c;它提供了大量的核心Java库&#xff0c;例如&#xff1a;集合、缓存、原生类型支持、并发库、通用注解、字符串处理和I/O操作等。 异常处理 传统的Java异常处理通常包括try-catch-finally块和throws关键字。 遇到FileNotFoundException或IOExce…

LocalDateTime类常用的方法介绍

Java 8引入了新的日期和时间API&#xff0c;其中包括LocalDateTime类&#xff0c;它表示没有时区信息的日期和时间。这个类是不可变的&#xff0c;并且线程安全。LocalDateTime类提供了大量的方法来处理日期和时间&#xff0c;包括格式化、转换和计算。 创建LocalDateTime对象 …

Android耗电分析之Battery Historian工具使用

Battery-Historian是谷歌推出的一款专门分析Bugreport的工具&#xff0c;是谷歌在2015年I/O大会上推出的一款检测运行在android5.0(Lollipop)及以后版本的设备上电池的相关信息和事件的工具&#xff0c;是一款对于分析手机状态&#xff0c;历史运行情况很好的可视化分析工具。 …

第106讲:Mycat实践指南:范围分片下的水平分表详解

文章目录 1.Mycat水平拆分的分片规则2. Mycat水平拆分之范围分片2.1.使用范围分片水平分表的背景2.2.水平分表范围分片案例2.3.准备测试的表结构2.4.配置Mycat实现范围分片的水平分表2.4.1.配置Schema配置文件2.4.2.配置Rule分片规则配置文件2.4.3.配置Server配置文件2.4.4.重启…

牛客网 华为机试 取近似值

本题是要实现四舍五入。我们采用float的数据类型&#xff0c;因为这样数据精度更高。然后我们可以把得到的数据0.5&#xff0c;然后再转换成int数据类型&#xff0c;因为转换成int数据类型的时候是向下取整的&#xff0c;比如4.9转换成int就是4&#xff0c;4.2转换成int也是4。…

Python错题集-7:DeprecationWarning: Conversion of an array with ndim(被弃用警告)

1问题描述 DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.) X[i] np.random.nor…

LCR 188. 买卖芯片的最佳时机

解题思路&#xff1a; 动态规划 方法一&#xff1a;常规解法 class Solution {public int bestTiming(int[] prices) {int n prices.length;if (n 0) return 0;int[] dp new int[n];int cost prices[0];for (int i 1; i < n; i) {cost Math.min(cost, prices[i]);dp…

Unity类银河恶魔城学习记录8-2 p78.Improving black with clone creating源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作【Unity教程】从0编程制作 Blackhole_Hotkey_Controller.cs using System.Collections; using System.Collectio…

Dell R620中文手册下载

poweredge-r620_owners-manual_zh-cn.pdf https://url20.ctfile.com/f/36743220-1030280698-8d9322?p2024 (访问密码: 2024)

为什么我建议你2024年一定要入局鸿蒙?

自去年发布现象级“爆款”手机Mate 60后&#xff0c;华为就备受关注。小灰作为一枚程序员&#xff0c;关注的重心更偏向于技术。华为手机搭载的国产自研的鸿蒙操作系统&#xff08;HarmonyOS&#xff09;&#xff0c;已经成为一个业界的里程碑&#xff0c;是我国国产技术自主化…

ChatGPT Plus 自动扣费失败,如何续订

ChatGPT Plus 自动扣费失败&#xff0c;如何续订 如果您的 ChatGPT Plus 订阅过期或扣费失败&#xff0c;本教程将指导您如何重新订阅。 本周更新 ChatGPT Plus 是一种每月20美元的订阅服务。扣费会自动进行&#xff0c;如果您的账户余额不足&#xff0c;OpenAI 将在一次扣费…

C语言写学生信息管理系统

说明:本博文来自CSDN-问答板块,题主提问。 需要:用C语言设计一个学生信息管理系统(尽量不使用指针),学生信息包括学号,姓名,数学成绩,C语言成绩,英语成绩和每个学生的总成绩这几项。系统要实现如下几个功能:1.添加学生2.删除学生3.修改学生信息4.查询学生信息5进行学…