当前位置: 首页 > news >正文

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

一、多态的定义

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

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

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • TCP与UDP传输的学习
  • GraphQL:API开发的未来,重塑数据交互的艺术
  • 发条朋友圈赚900,这钱太好赚了吧?
  • 照片逼真肖像动画的音频驱动合成——AniPortrait翻译与调试
  • 【YOLO5 项目实战】(7)YOLO5 手势识别
  • 45+用户占比近30%,网文产业如何赋能IP长链?
  • 如何使用gewe开发微信机器人
  • 010 OSS文件上传
  • 自动化开发流程:使用 GitHub Actions 进行 CI/CD
  • 使用 Dify 和 AI 大模型理解视频内容:Qwen 2 VL 72B
  • React+Vis.js(05):vis.js的节点的点击事件
  • 主机安全-网络攻击监测
  • 观测云对接 Pinpoint 最佳实践
  • 设备运维故障排查与修复技巧
  • 宝塔面板配置node/npm/yarn/pm2....相关全局变量 npm/node/XXX: command not found
  • [译]如何构建服务器端web组件,为何要构建?
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Angular2开发踩坑系列-生产环境编译
  • Javascript设计模式学习之Observer(观察者)模式
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • KMP算法及优化
  • leetcode388. Longest Absolute File Path
  • mysql innodb 索引使用指南
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Ruby 2.x 源代码分析:扩展 概述
  • vagrant 添加本地 box 安装 laravel homestead
  • 阿里云应用高可用服务公测发布
  • 搭建gitbook 和 访问权限认证
  • 分布式事物理论与实践
  • 记一次用 NodeJs 实现模拟登录的思路
  • 力扣(LeetCode)56
  • 我的业余项目总结
  • 赢得Docker挑战最佳实践
  • 用Visual Studio开发以太坊智能合约
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • "无招胜有招"nbsp;史上最全的互…
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (回溯) LeetCode 131. 分割回文串
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (四)Linux Shell编程——输入输出重定向
  • (算法)区间调度问题
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)jdk与jre的区别
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • *Django中的Ajax 纯js的书写样式1
  • 、写入Shellcode到注册表上线
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net 受管制代码
  • .NET/C# 的字符串暂存池
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态