Java基础——自学习使用(多态)

news2024/9/22 23:19:05

一、多态的定义

        父类的引用指向子类的对象。

B继承A,A ab=new B();——父类引用指向子类的对象。

二、创建对象了解多态的内部结构

(1)父类即A类对象的内存结构图

(2)子类即B类对象的内存结构图

 由于B中重写了父类A中的run方法,所以A中的方法run被覆盖掉了,看上图。

(3)ad的内存图(A ab=new B();)

 创建子类对象一定会创建父类对象。所以在内存当中A和B的对象都有。

输出:

 

 由于覆盖run方法,所以输出的方法使用的是子类重写的方法。(子类发生过重写(重写的方法覆盖之前的方法),此时该重写的方法是父类与子类所共用的)

内存中会出现A和B的对象,但因数据类型决定数据的存储形式,ab被A类型所决定,所以只能调用A对象的数据。

三、多态的作用

        向上转型

向上转型:子类的对象可以被父类的类型所接受——>>父类的引用指向子类的对象

四、习题(向上转型)

类A,B,C,D,其中B继承A,C、D继承B。

代码:

public class A {
    public String show(D obj) {
        return ("A and D");
    }
    public String show(A obj) {
        return ("A and A");
    } 
}
public class B extends A{
    public String show(B obj){
        return ("B and B");
    }
    
    public String show(A obj){
        return ("B and A");
    } 
}
public class C extends B{

}

public class D extends B{

}

Test类,作为测试类

public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();
        
        System.out.println("1--" + a1.show(b));
        System.out.println("2--" + a1.show(c));
        System.out.println("3--" + a1.show(d));
        
        System.out.println("4--" + a2.show(b));
        System.out.println("5--" + a2.show(c));
        System.out.println("6--" + a2.show(d));
        
        System.out.println("7--" + b.show(b));
        System.out.println("8--" + b.show(c));
        System.out.println("9--" + b.show(d));      
    }

        首先创建a1对象时会创建一个内存空间,创建b时会先创建A类对象在创建B类对象两者在同一内存空间。

        然后分别在两个内存空间,所以上述输出只能调用A类中的方法,而B类的show(A)方法的重写只能影响a对象,无法影响到a1对象,所以调用A类本身的show(A)方法,输出A and A

        首先注意创建a1对象时会创建一个内存空间,创建对象c时会创建A类对象和创建B类对象还有c类对象三者在同一内存空间。

        然后分别在两个内存空间,所以上述输出只能调用A类中的方法,而B类的show(A)方法的重写只能影响a对象,无法影响a1对象,所以调用A类本身的show(A)方法,输出A and A

③        

        首先注意创建a1对象时会创建一个内存空间,创建对象d时会创建A类对象和创建B类对象还有d类对象三者在同一内存空间。

        然后分别在两个内存空间,所以上述输出只能调用A类中的方法,所以调用A类本身的show(D)方法,输出A and D

        首先注意创建a2对象时,因为是newB()所以会先创建一个A类对象在创建一个B类对象,此时完成了A类对象show(A)的重写,但因为A a2 =new A(),a2的类型为A,只能访问A类对象的方法。此时两个对象都在一个内存空间,创建对象b时会创建A类对象和创建B类对象两者在同一内存空间。

        然后分别在两个内存空间,所以上述输出只能调用A类中的方法,而B类的show(A)方法的重写只能影响a对象,无法影响到a1对象,所以调用A类本身的show(A)方法(但注意此时A类本身show(A)方法也已经完成重写),输出B and A

 ⑤

        首先注意创建a2对象时,因为是newB()所以会先创建一个A类对象在创建一个B类对象,此时完成了A类对象show(A)的重写,但因为A a2 =new A(),a2的类型为A,只能访问A类对象的方法。此时两个对象都在一个内存空间,创建对象c时会创建A类对象和创建B类对象还有c类对象三者在同一内存空间。

        然后分别在两个内存空间,所以上述输出只能调用A类中的方法,而B类的show(A)方法的重写只能影响a对象,无法影响到a1对象,所以调用A类本身的show(A)方法(但注意此时A类本身show(A)方法也已经完成重写),输出B and A

        首先创建a2对象时,因为是newB()所以会先创建一个A类对象在创建一个B类对象,此时完成了A类对象show(A)的重写,但因为A a2 =new A(),a2的类型为A,只能访问A类对象的方法。此时两个对象都在一个内存空间,创建对象d时会创建A类对象和创建B类对象还有d类对象三者在同一内存空间。

        然后分别在两个内存空间,所以上述输出只能调用A类中的方法,所以调用A类本身的show(D)方法,输出A and D

        首先注意创建b对象时,因为是newB()所以会先创建一个A类对象在创建一个B类对象,此时完成了A类对象show(A)的重写,但因为b是B类对象,且继承了A类对象,所以b可以访问A和B类对象的方法,调用show(A),输出B and A

⑧  

        首先注意创建b对象时,因为是newB()所以会先创建一个A类对象在创建一个B类对象,此时完成了A类对象show(A)的重写,但因为b是B类对象,且继承了A类对象,所以b可以访问A和B类对象的方法,此时两个对象都在一个内存空间,创建对象c时会创建A类对象和创建B类对象还有c类对象三者在同一内存空间。

        然后分别在两个内存空间,所以上述输出只能调用A类和B类中的方法,所以调用重写后的show(A)方法,输出B and A

 

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

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

相关文章

EazyDraw for Mac 矢量图绘制设计软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功 三、运行测试安装完成!!! 效果 一、下载软件 下载软件…

SSRF和CSRF实战复现

文章目录 SSRFWeb-Hacking-Lab-master1、Centos未授权访问2、Ubuntu未授权访问3、Ubuntu传入公钥访问4、ssrf_redis_lab_pickle_redis_lab CSRF:windphp SSRF SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 f…

第三课《排序》

前言 排序是将一组数据,按照指定的顺序或要求来进行排列的过程。是数据结构相关课程和内容较为重要和核心的内容之一,常常作为考试题和面试题目来考察学生和面试者,因此熟练掌握经典的排序算法原理和代码实现是非常重要的 本文介绍了几大较为…

AJAX(5)——Promise

Promise Promise对象用于表示一个异步操作的最终完成或失败及其结果值 语法: //创建Promise对象const p new Promise((resolve, reject) > {//执行异步代码setTimeout(() > {// resolve(成功结果)reject(new Error(失败结果))}, 2000)})//获取结果p.then(r…

坚鹏讲人才第13期:个人数字化转型——个人与时代的共赢之选

坚鹏讲人才第13期:个人数字化转型——个人与时代的共赢之选 在这个日新月异的时代,数字化转型已经成为当今时代的必然趋势,它不仅改变了我们的生活方式,也正在改变着各行各业的运营模式。数字化时代,不仅需要数字化企…

网络udp及ipc内存共享

大字符串找小字符串 调试 1. 信号处理函数注册:•一旦使用 signal 函数注册了信号处理函数,该函数就会一直有效,直到程序结束或者显式地取消注册。2. 注册多次的影响:•如果多次注册同一信号的处理函数,最后一次注册的…

快9月了刚结束基础,武忠祥强化vs张宇18讲应该如何选择?

快9月了,最近有一部分同学刚结束基础,在后台提问:强化到底该学武忠祥还是张宇18讲?其实这个问题,如果你是6月份开始强化,很好回答,但是现在已经快9月份了,很多同学都开始做真题了&am…

代码随想录 刷题记录-16 贪心算法(1)贪心理论基础及习题

一、理论基础 什么是贪心 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心的套路(什么时候用贪心) 贪心算法并没有固定的套路。 所以唯一的难点就是如何通过局部最优,推出整体最优。 靠自己手动模拟&#xff0c…

深度学习 回归问题

1. 梯度下降算法 深度学习中, 梯度下降算法是是一种很重要的算法. 梯度下降算法与求极值的方法非常类似, 其核心思想是求解 x ′ x x′, 使得 x ′ x x′ 在取 x ⋆ x^{\star} x⋆ 时, 可以使得 l o s s 函数 loss函数 loss函数 的值最小. 其中, 在求解 x ′ x x′ 的过…

罗德与施瓦茨RS、UPV 音频分析仪 250KHZ 双通道分析仪UPL

罗德与施瓦茨 UPV 音频分析仪的规格包括&#xff1a; 模拟 双通道分析仪&#xff1a;带宽高达 250 kHz 生成正弦波信号&#xff1a;单通道最高 185 kHz&#xff08;需要 B1&#xff09;和双通道最高 80 kHz FFT本底噪声&#xff1a;< -140dB 固有频率响应&#xff08;20 …

链动 2+1 模式小程序 AI 智能名片商城源码培训邀约策略研究

摘要&#xff1a;本文深入剖析链动 21 模式小程序 AI 智能名片商城源码的培训邀约策略&#xff0c;从该源码的价值出发&#xff0c;阐述邀约的重要性&#xff0c;并详细介绍具体的邀约策略&#xff0c;旨在为相关培训活动提供切实可行的指导&#xff0c;提高邀约成功率&#xf…

前端如何快速切换node版本:nvm

安装之前最好卸载计算机已经安装的node&#xff08;通过Windows菜单找到Node.js的卸载程序&#xff0c;运行卸载程序&#xff09;。下载nvm安装包&#xff1a;nvm安装地址。安装nvm&#xff0c;选择nvm安装根路径指定nodejs的安装路径打开命令行&#xff0c;输入nvm -v 可查看版…

Object.create的原型继承

● 首先我们来从这种方法来创建一个和之前一样计算年龄的方法 const PersonProto {cacleAge() {console.log(2038 - birthYear);} };const zhangsan Object.create(PersonProto); console.log(zhangsan);● 发现确实可以实现原型继承的特性 const PersonProto {cacleAge()…

odoo17 group col 属性

odoo17 group col 属性 以前版本&#xff0c;col4,在17中不能用了&#xff0c;或者方法变了 <record id"hetong.addfj_wizard" model"ir.ui.view"><field name"name">合同附件</field><field name"model">het…

免费的大模型插件llm.nvim

llm.nvim&#xff08;https://github.com/StubbornVegeta/llm.nvim&#xff09;是一款基于cloudflare的免费大模型插件&#xff0c;你可以像使用ChatGPT一样和它进行对话 在使用这款插件之前&#xff0c;你需要注册cloudflare&#xff0c;获取你的account和API key。你可以在这…

RCE - - 无字母数字远程命令执行

题目源码 <?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code)){die("NO.");}eval($code); }else{highlight_file(__FILE__); } 分析 这道题 code 接 get 传…

【Qt】常用控件QProgressBar

常用控件QProgressBar 使用QProgressBar表示一个进度条&#xff01;&#xff01;&#xff01; QProgressBar的核心属性 属性说明 minimum 进度条最⼩值 maximum 进度条最⼤值 value 进度条当前值 alignment ⽂本在进度条中的对⻬⽅式. Qt::AlignLeft : 左对⻬Qt::Alig…

AJAX(4)——XMLHttpRequest

XMLHttpRequest 定义&#xff1a;XMLHttpRequest(XHR)对象用于与服务器交互。通过XMLHttpRequest可以在不刷新页面的情况下请求特定URL&#xff0c;获取数据。这允许网页在不影响用于操作的情况下&#xff0c;更新页面的局部内容。XMLHttpRequest在AJAX编程中被大量使用 关系…

第6章 B+树索引

目录 6.1 没有索引的查找 6.1.1 在一个页中的查找 6.1.2 在很多页中查找 6.2 索引 6.2.1 一个简单的索引方案 6.2.2 InnoDB中的索引方案 6.2.2.1 聚簇索引 6.2.2.2 二级索引 6.2.2.3 联合索引 6.2.3 InnoDB的B树索引的注意事项 6.2.3.1 根页面万年不动窝 6.2.3.2 内节…

MYSQL————数据库的约束

1.约束类型 1.not null&#xff1a;指示某列不能存储null值 2.unique&#xff1a;保证某列的每行必须有唯一值 3.default&#xff1a;规定没有给列赋值时的默认值 4.primary key&#xff1a;not null和unique的结合。确保某列&#xff08;或两个或多个列的结合&#xff09;有唯…