java多态的理解

article/2025/9/12 22:52:15

目录

  • 一、多态的定义:
  • 二:多态的好处:
  • 三、实现多态的三个条件(前提条件,向上转型、向下转型):
  • 四、多态使用:虚拟方法调用
    • 深入分析多态:
  • 向下转型
    • instanceof关键字的使用
    • 经典练习题:
  • 五、重写和重载的区别(面试问题):
    • debug调试:

一、多态的定义:

多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
在运行时,可以通过指向基类的引用,来调用实现派生类(子类)中的方法。

二:多态的好处:

使用多态,我们可以很好的完成代码的解耦和工作,加强代码的可扩展性,是代码更加灵活,在不改变原有接口方法的情况下简化流程等,总结一下就是:

减耦合
增强可以替换性
可扩展性
灵活性等…

从代码看,我们可以省去很多很多重载的方法。

三、实现多态的三个条件(前提条件,向上转型、向下转型):

1、继承的存在;(继承是多态的基础,没有继承就没有多态)
2、子类重写父类的方法。(多态下会调用子类重写后的方法)
3、父类引用变量指向子类对象。(涉及子类到父类的类型转换)

四、多态使用:虚拟方法调用

有了多态性以后:我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写后的方法
1.多态成员变量:编译运行看左边

Fu f=new Zi();
System.out.println(f.num);//f是Fu中的值,只能取到父中的值

2.多态成员方法:编译看左边,运行看右边

Fu f1=new Zi();
System.out.println(f1.show());//f1的门面类型是Fu,但实际类型是Zi,所以调用的是重写后的方法。

特别注意:
(1)当子父类都明确声明了同样的属性的时候,不是说属性的覆盖,而是有两份一模一样的属性。(一个是父亲的,一个是儿子的),而非private方法在父子类中都显式声明了的话,会进行覆盖/重写操作的。
(2)对象的多态性,只适用于方法,不适用于属性,属性是编译和运行都看的左边。

代码演示属性不具有多态:

public class Person{int id=1001;public static void main(String[] args) {Person p=new Man();System.out.println(p.id);//输出结果为1001,而不是1002}
}
class Man extends Person{int id=1002;
}

分析:
栈中的变量名为p,是Person类型的,在堆空间中,Person里面有id为1001,Man也定义了一个id为1002,p指过去。所以堆空间中本身就有两个id属性,调用哪个由左边决定的。
即编译和运行都看左边,因为声明的是Person类型,所以调的id是1001,当声明类型为Man时,才会调1002。

深入分析多态:

父类 a=new 子类,实际对象时子类。由于向上转型,我们可以用父类在编译期间代替子类,使得编译不报错,当然你调用的方法必须是父类所拥有的,不然编译监察报错,

其实new 子类(),那么实际类型就是子类,运行期间就是子类的方法和属性啊,而一个父类有多个子类,那么就造成多态的生成和原理,那么问题来了,为什么

我们的属性不具有多态特性。我们直接调用属性值,那么出来的就是父类的属性值,为什么呢?

这个就是静态绑定和动态绑定的问题了

编译期间的绑定就是静态绑定,运行期间的绑定就是动态绑定,java为了实现多态的这个机制,选择让方法在运行期间绑定对应对象所对应实际类型,选择让属性在编译期间绑定其所对应实际类型。那么这个问题不就解决了?

编译期间时,肯定是父类的类型,如果直接调用属性,故名思议则是父类所对应的属性值。而方法则是在运行期间绑定的,这个对象实际上实际是子类对象,那么运行期间就肯定是子类类型,故方法是子类的方法,而在方法中调用的值是子类的值就更简单了,我们调用子类的值时,实际上简写了this.属性,而this却是指当前对象。当前对象只有被实例化才会有对象,那么肯定是运行期间,故在方法里面调用属性值是子类的值。

总结:
属性:编译和运行都看左边
方法:编译看左边,运行看右边

在这里插入图片描述

  • 虚拟方法调用(多态情况下)
    子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译器是无法确定的。
    Person e = new Student();
    e.getInfo();//调用Student类的getInfo()方法。

  • 编译时类型和运行时类型
    编译时e为Person类型,而方法的调用时在运行时确定的,所以调用的是Student类的getInfo方法。–动态绑定

向下转型

在这里插入图片描述

1.有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。
2.使用向下转型,使用强制类型转换符。但是注意,使用强转时,可能出现ClassCastException异常、类转换异常。

instanceof关键字的使用

a instanceof A:判断对象a是否是类A的实例。如果是,返回true,如果不是,返回false.

使用场景:
为了避免在向下转型时出现类转换异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。

如果a instanceof A 返回true,则a instanceof B 也返回true.其中类B是类A的父类。

注意:要使得向下转型正常运行,想要显式的向上转型,再向下转型。而且先进行instanceof类型判断后再向下转型。

经典练习题:

在这里插入图片描述
在这里插入图片描述
总结的知识点:
在这里插入图片描述

五、重写和重载的区别(面试问题):

在这里插入图片描述
①两者的概念:
重载:两同一不同:同一个类,方法名相同,参数列表不同,方法彼此就形成了方法的重载,构造器也可以重载。
重写:子类继承父类以后,可以对父类中同名的同参数的方法,进行覆盖操作。
②重载和重写的规则:
重载规则:
方法名称必须相同。
参数列表必须不同(个数不同、或类型不同、或参数排列顺序不同)。
与方法的返回类型和访问修饰符 无关。(这两个不是判断重载的依据)。

重写规则:发生在父子类之间
①:子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同

②:子类重写的方法的权限修饰符不小于(大于等于)父类被重写的方法的权限修饰符
2.1特殊情况:子类不能重写父类中声明为private权限的方法。

③:返回值类型:

父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void.
父类被重写的方法的返回值是A类型,则子类重写的方法的返回值类型只能是A类或A类的子类。
父类重写的方法的返回值类型是基本数据类型(比如double),则子类重写的方法的返回值必须是相同的,都是double.
④子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型。

③多态性的表现:
重载:不表现为多态性,编译期的静态绑定。
重写:表现为多态性。运行期的动态绑定。

debug调试:

在这里插入图片描述


http://chatgpt.dhexx.cn/article/YfD4jP9W.shtml

相关文章

解析java多态经典习题

解析java多态经典习题 1 题目一 1.1 题目内容 编写程序实现乐手弹奏乐器。乐手可以弹奏不同的乐器从 而发出不同的声音。 可以弹奏的乐器包括二胡、钢琴和琵琶。 实现思路及关键代码: ①定义乐器类Instrument,包括方法makeSound() ②定义乐器类的子类…

java多态(java多态的概念)

简述什么是JAVA中的多态 父类的引用可以引用子类的对象。换句话说,如果有一个类继承或实现了某个类或接口,那么被继承或实现的类或接口可以创建那一个类的对象,这样程序就会变得很灵活。 java中多态的定义是什么? 多态性是指允许不…

彻底搞懂Java多态

很多初学者在自学Java时候都卡在了Java多态,本教程从实际案例出发阐述Java多态现象及Java多态的原理。 通过案例理解多态的现象 需求描述 多态是类在继承关系下的一种形态,下边先通过一个需求展示下多态的现象。 攀博课堂是一个在线教育学习平台&…

java多态实现原理

众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。C 和 Java 作为当前最为流行的两种面向对象编程语言,其内部对于多态的支持到底是如何实现的呢&#xff0…

新手小白学JAVA 面向对象之多态

多态 1. 概念 多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。 可以把不同的子类对象都当作父…

html表单实例:用户反馈表单页面代码

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>demo</title> </head> <body><h1 align"center">用户反馈表单</h1><form method"post"><…

html 下拉多选框代码,js实现下拉复选框效果(代码实例)

本章给大家带来用js实现下拉复选框效果(代码实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 先看看效果: 下面我们看看代码: HTML代码: HTMLCSSJavaScriptjQueryPHPMySQLJavaC#C++Pyhtoncss代码:div {display: inline-block; } select {min-width…

HTML实例--制作表单

运用表格和表单基础知识简单制作一个表单 表单制作使用表格来对表单进行排版美化 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">…

Html5 Canvas绘图实例

前些年的时候&#xff0c;突然对Canvas感兴趣&#xff0c;利用空闲时间做一些Canvas小例子进行练习&#xff0c;仅供学习分享使用。如有不足之处&#xff0c;还请指正。 什么是 Canvas&#xff1f; HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。画布是一个矩形区域…

用html做个随机点名系统代码,html座位表随机点名的实例代码

这篇文章详解html座位表随机点名的实例代码点名 td { width: 9.09%; height: 50px; text-align: center; } .tdBg { background-color: pink; } var timer null; // 这是一个函数&#xff0c;表示一个功能 function start(){ timer setInterval(function(){ // alert("要…

在html中如何写日期的代码,日期html代码

日期 时间 星期的html代码是什么代码 创建静态方法findDate,返回List类型。 声明一个List list集合,向List集合存储英文星期。 调用findDate静态方法,并打印List集合存储结果。 CSS布局HTML小编今天和大家分享一个显示当前系统日期的HTML代码 显示的格式为“某年某月某日”,…

html向上移动图片代码,图片随网页上下移动的代码实例

我们以腾讯QQ网页在线客服为例,大家将代码拷到DW中,用心体会。图片随网页上下移动的代码实例 function picsize(obj,MaxWidth){img=new Image(); img.src="/obj.src"; if (img.width>MaxWidth) {return MaxWidth; } else {return img.width; } } function Close…

html5 简单实例源代码

实例教程&#xff1a;http://www.w3school.com.cn/jquery/ 源代码下载&#xff1a; http://download.csdn.net/detail/wyx100/9827067 html5文件布局结构 html5文件布局结构html5语言标记 浏览器执行效果 html5文件源代码 源代码下载&#xff1a; http://download.csdn.net/de…

html实例,实现表单

1.使用HTML完成下列功能 <!doctype html> <html><head><!-- <meta charset"GBK">--></head><body><table width"60%" border"3" align"center" bgcolor"#F0F8FF" borderColor…

html导航栏纵向代码,html横向导航栏怎么做?横向导航条代码实例

有不少小伙伴在刚学习 html 的时候都会遇到这样一个问题&#xff1a;html 横向导航栏怎么做&#xff1f;今天W3Cschool小编就为大家分享一下简单的横向导航条代码&#xff0c;相信会对大家有所帮助。 html 横向导航栏一般用两种方法来制作&#xff1a;第一种&#xff0c;我们使…

html如何插入下拉菜單,html下拉菜单怎么做?html下拉菜单的代码实例介绍

本篇文章主要的介绍了关于HTML select标签下拉菜单的做法实例&#xff0c;还有一个html的一些网站的下拉菜单的用法都放在了文章中&#xff0c;下面就让我们一起来看看这篇文章吧 首先我们要知道html下拉菜单的代码是什么&#xff1f; 很明显是select元素可创建单选或多选菜单。…

HTML代码示例和介绍

HTML基本的格式 <!DOCTYPE html> <!-- 声明文档。定义html --> <html lang"en"> <!-- 元素是页面的根元素 --> <head> <!-- 元素包含文档的元数据 --><meta charset"UTF-8"&g…

STM32仿真器下载程序出现SWD/JTAG Communication Failure的解决方法

一、解决办法&#xff1a;将STM32开发板断电&#xff0c;将板子上的BOOT0用短路帽接入3.3V高电平&#xff0c;重新插入仿真器&#xff0c;下载程序到开发板。不出意外可见程序烧录成功&#xff0c;此时将BOOT0接回低电平&#xff0c;后续烧录程序便不会出现SWD/JTAG Communicat…

keil无法识别JTAG仿真器解决办法

一、操作步骤 1、操作环境&#xff1a; 开发板&#xff1a;野火STM32H743XI 电脑系统版本&#xff1a;Windows 10 专业版 使用笔记本调试 JTAG&#xff1a;Fire-Debugger 野火 高速版DAP编程器 2、操作步骤&#xff1a; 将JTAG连接在STM32调试接口和电脑USB接口上&#xff0c…

JTAG调试原理

转自&#xff1a;https://blog.csdn.net/sinat_24088685/article/details/50980501 1.介绍 JTAG&#xff08;Joint Test Action Group&#xff0c;联合测试行动小组&#xff09; 是一种 国际标准测试 协议&#xff0c;主要用于 芯片内部测试 。现在多数的高级器件都支…