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

Day3(多态详解之上下转型+属性重写+动态绑定机制+instanceof+多态数组)

小伙伴们大家好!我是阿澜,今天依旧带来韩顺平笔记,需要的小伙伴可以看看。如果有一起学Java的可以留个印一起打卡,我每天会发布当天的笔记和一些感悟~~

今日课程内容:韩顺平Java课程309~~316

目录

一,多态的向上转型

1.能使用哪些方法和属性是由编译类型决定的

2.最终的运行效果是看子类的具体实现

二,多态的向下转型

三,属性没有重写一说!!

四,instanceof操作符的类型问题

五,易错题

六,动态绑定机制

七,多态数组


一,多态的向上转型

定义:父类的引用指向了子类的对象。

1.能使用哪些方法和属性是由编译类型决定的

比如下面:

首先我们假定新创建一个Animal的子类叫做Cat,在Cat里新写一个catch Mouse方法(抓老鼠)。(父类Animal里没有的哦)

接着创建一个animal对象,他的运行类型是Cat,我们想在main方法里调用catchmouse方法就会写出animal.catchMouse()(别忘了括号),但是此时会编译器报错。为什么呢?

因为在编译阶段能使用哪些方法和属性是由编译类型决定的 :编译器在编译的时候是按照Animal类型编译的,而Animal类型没有catchmouse这个方法,哪怕实际上animal对象的实际类型是Cat类型,但是编译器不知道的,他只认为animal是Animal类型,而Animal类型没有的你在调用方法的时候就不能用。如果你用了,那么你就会编译报错

ps:Animal animal =new Cat()

左边的类型是编译类型,右边是运行类型。

2.最终的运行效果是看子类的具体实现

刚刚的编译阶段已经告一段落,来到了代码实际运行的阶段。编译成功后代码运行的时候实际上是以Cat类来对待的,优先从Cat里找成员。这与前面并不矛盾,因为1.1讲的是编译阶段(也就是javac阶段),编译好后运行的时候就要看运行类型了(即Java阶段)。

即调用时从子类类型(运行类型)开始找方法运行。

二,多态的向下转型

如果我们想使用子类特有的方法该怎么办呢?

这就要用到向下转型了

这里关于第二点要强调一下:这里只是转变了父类的引用类型,但是创建的这个对象的类型并没有改变。这个对象创好后的类型就不变了,你所能改变的不过是引用类型罢了。

例:

相当于原来有一个Animal类型的变量名animal指向了内存中开辟的一块Cat对象,而现在又创建了一个Cat类型的变量名cat指向同一块Cat对象。只不过编译的时候有区别罢了。

就像一个人小时候叫小明,长大后改名了叫二狗。虽然名字变了,但是指向的人是一样的。

答案:不行

因为animal的运行类型是Cat,要向下转换也只能是转向Cat,而不是Dog。

三,属性没有重写一说!!

和之前的方法不同,属性的值是由编译类型觉定的

这里开辟了一个子类的sub对象并且进行了向上转型,在内存里sub对象有两个属性:一个是父类的count=10,一个是子类的count=20;

在main方法中,如果要输出base。count的值的话,如果按照方法的运行规则,从子类开始访问的话,就应该是count=20.。但是,输出的是10,因为属性的值是由编译类型决定的。

四,instanceof操作符的类型问题

那么在判断的时候是按照编译类型还是运行类型来判断的呢?

先说答案:运行类型。如果 前面的运行类型是后面的类型或其子类,那么返回true。

ps:此操作符只适1用于有关系的父子类之间的比较,如果两个毫无关系的类型进行比较会报错。

五,易错题

1.

2.

这里关于b==s的输出有个强调,这就是前面说的只改名字不改类型,b和s指向的是同一个空间,所以返回true。

六,动态绑定机制

例题:

以a.sum为例,因为子类中没有sum方法所以要从父类A中调用sum方法,而sum方法需要调用getI方法,那么问题来了,父类和子类都有getI方法,用哪个呢?

这就要用到动态绑定机制了,即调用对象方法的时候需要与对象的运行方法绑定,也就是说a的运行方法,也就是子类了。然后开始调用子类的getI方法,而用这个方法又要用属性i,这个时候就不用往出跳了,在哪个类,就用谁的方法。

一句话总结:

动态绑定只看有没有重写方法,如果写了就用新的方法,没写就用父类的方法。

用方法的时候就看运行类型,属性没要求,在哪个类里要用就在哪个类里看。

七,多态数组

定义:数组的定义类型为父类类型,而里面存放的实际上是子类类型。

这里有个注意点,因为数组的元素可能是不同的子类,那么在调运方法时要切记动态绑定机制!!这里使用元素的编译类型是父类类型,而运行类型要看自己的定义!

http://www.jsqmd.com/news/901527/

相关文章:

  • 为GitHub构建非开发者友好门户:React+Next.js技术实现与架构设计
  • 别再被‘此更新不适用’坑了!手把手教你搞定KB2999226和VC++运行库安装
  • 构建生产级RAG系统:从向量检索到工程架构的实战指南
  • 2026年宝钢HC1030/1300MS吉帕钢深度评测:高强度轻量化汽车用钢首选,厂家直供应用解析 - 品牌企业推荐师(官方)
  • 别再死记硬背了!用Unity的LookRotation让物体‘看向’目标,这篇图解教程帮你彻底搞懂
  • 基于n8n与Ollama构建零成本本地AI内容自动化流水线
  • 2026年 宝钢镀锌HC420/780DHD+Z吉帕钢推荐:高强塑汽车用钢/轻量化冷轧板材/先进高强钢供应商实力解析 - 品牌企业推荐师(官方)
  • 长期项目使用Taotoken后月度账单波动与模型用量分布的可视化观察
  • 2026年 哈尔滨电工培训机构推荐榜单,低压电工/高压电工/电工考证/电工上岗证/电工证件复审/安监应急电工作业精选指南 - 品牌企业推荐师(官方)
  • 基于区块链与智能合约的AI智能体协作系统设计与实现
  • RAG与微调生产实践:从技术原理到场景落地的决策指南
  • HttpRunner 入门
  • CUBE:融合B样条与神经网络的3D人脸混合表示技术解析
  • CTF选手的工具箱:用Python脚本自动化处理MISC与Web题(附Writeup实战代码)
  • MonkeyCode 新手极速入门与实战指南
  • 别再手动点鼠标了!用Python批量给Neo4j知识图谱上色和调整样式
  • 游戏交易点卡充值源码系统制造厂
  • 在国产Deepin系统上搞定Halcon 20.11.2:一份给Linux新手的保姆级安装避坑指南
  • 对比按需计费与 Token Plan 套餐在 Taotoken 上的成本差异与选择建议
  • ThinkPad X13 装 Ubuntu 16.04 双系统,我踩过的那些坑(含 grub-install 错误修复)
  • 多智能体系统交互困境:内部日志失效与外部决策锚点构建
  • SpringBoot 消费者并发控制:线程池配置
  • 深入NVIDIA Container Runtime Hook:它是如何‘劫持’Docker容器启动流程,为你注入GPU能力的?
  • 深度学习在射频指纹识别中的安全挑战与优化策略
  • 从被动执行到主动驱动:构建个人高效执行系统的技术心法
  • AI记忆系统设计解析:从上下文窗口到分层压缩与检索机制
  • 告别Xshell:用VNC Viewer远程操控Ubuntu桌面,图形化运维真香了
  • Arkts网页设计
  • FPGA加速DNN高光谱图像分割的优化实践
  • Cursor Composer 最佳实践