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

【Java 入门 Day10】多态|java整活天花板,一个父类变量拿捏全子类,抽象玩法全解析开篇前言(下)

继承是儿子蹭老爹资源,多态就是老爹的户口本(父类引用)既能绑定亲儿子、二儿子、三儿子,父类变量灵活指向任意子类对象,是面向对象最抽象、项目用得最多的特性,搞懂多态直接通关面向对象大半难点。

一、多态核心定义:父类引用指向子类对象(语法:父类 引用名 = new 子类 ())

经典示例:

java运行

//父类Animal引用a,实际装的是Dog狗子对象 Animal a=new Dog();

人话梗翻译:户口本(Animal 引用 a)登记户主是动物,但户口本实际持有者是狗子,编译看左边(父类)、运行看右边(子类)

  1. 编译阶段:只能调用父类写过的属性、普通方法,户口本只能用户主规定权限;
  2. 运行阶段:如果子类重写了父类方法,优先跑子类重写方法,户主名头、办事是儿子来干。

举生活化梗: 老板(父类人)招聘员工(子类程序员 / 产品 / 测试),统一用工牌(父类引用)管理,工牌都是员工,但是敲代码、画原型、找 bug 各自干活逻辑不一样,这就是多态落地。

二、父子引用双向转换(多态核心操作,避坑指南)

1. 向上转型(小→大,自动转 = 多态原生写法)

子类引用直接赋值给父类,不用强转,Dog d=new Dog();Animal a=d;梗:员工证件(子类)上交换成通用工牌(父类),上交流程全自动不用额外手续,也就是多态原生写法。

2. 向下转型(大→小,强制转换,极易翻车)

父类引用转回子类,必须强制类型转换,语法:子类 变量=(子类)父类引用;

java运行

Animal a=new Dog(); Dog d=(Dog)a;

⚠️翻车惨案:实际对象是猫,强行转狗子,运行直接报ClassCastException类型转换异常。

java运行

Animal a=new Cat(); Dog d=(Dog)a;//编译能过,运行直接崩
3. 救命关键字 instanceof,杜绝转型报错

用法:引用名 instanceof 类名,判断引用实际对象能不能匹配目标类,匹配返回 true,反之 false。

java运行

Animal a=new Dog(); if(a instanceof Dog){ Dog d=(Dog)a; }

人话:换证件前先核验身份,是狗子再换回狗子证件,不是直接跳过转换,完美规避转型翻车。

4. 无继承不能转

两个毫无血缘的类,父子强转编译直接报错,狗子和水杯没关系,不能互相换证件。

三、多态三大落地场景(项目天天用)

  1. 数组存储:父类数组,能存所有子类对象

java运行

//动物数组,狗、猫全塞进去 Animal[] arr={new Dog(),new Cat()};

梗:统一收纳箱,既能装狗粮也能装猫粮,箱子规格统一,内部东西各不相同。 2.方法传参:形参写父类,所有子类实例都能当实参传入 方法void feed(Animal an){},调用既能喂狗也能喂猫,一个方法适配全子类。 3.方法返回值:返回值写父类,方法能返回任意子类对象。

四、多态的真香优势

  1. 屏蔽子类差异,统一管控:不用给狗、猫分别写喂食方法,统一父类接收,减少冗余代码;
  2. 代码灵活易扩展:后续新增兔子子类,原有喂食、数组代码一丁点不用改,直接新增兔子类即可接入,拓展性拉满。

五、三大特性终极总结(整活总结)

  1. 封装:锁死内部数据,对外开放正规接口 = 私房钱上锁,存取走银行窗口;
  2. 继承:子类白嫖父类资源,is-a 血缘绑定 = 富二代继承家产;
  3. 多态:父类引用装全子类,统一管理不同子类 = 统一工牌管理五花八门打工人。

三大特性啃完,面向对象基础正式通关!后面抽象类、接口都是在三大特性之上延伸,吃透封装继承多态,后续 Java 学习直接一路绿灯~

http://www.cnnetsun.cn/news/2820623.html

相关文章:

  • 保姆级避坑指南:SAP SPRO中给公司代码分配采购组织,新手最容易搞混的几点
  • 创维E900V21C救砖记:从TTL跑码异常到飞线修复,手把手教你排查硬件短路
  • 别再搞混了!Android布局中margin和padding的实战避坑指南(附ConstraintLayout案例)
  • 从Wireshark GUI到命令行:在无图形界面的CentOS 7服务器上,用tshark抓取并分析HTTP请求的完整流程
  • 告别环境冲突:用PyCharm 2023.1创建项目时,如何正确选择并配置Python 3.10解释器?
  • 别再死记硬背了!用Proteus 8 Professional玩转51单片机:LED闪烁、按键检测、数码管显示一站式仿真
  • OpenGL ES开发避坑:为什么你的GLM头文件包含总报错?聊聊#include的两种写法
  • 别再傻傻分不清了!设计师必懂的PS和AI核心区别与选择指南(附实战场景)
  • 基于FPGA的SPWM信号发生器完整工程(含Quartus II工程文件与实测波形验证)
  • 别再对着空白画布发愁了!用Altium Designer 18快速搞定STM32F103C8T6最小系统原理图(附完整库文件)
  • 数以轻舟Agent:做表AI智能体与普通大模型直接处理数据的区别
  • 前端直接生成带格式Excel:字体、行列宽、合并单元格全搞定
  • MyBatis-Plus CRUD 操作实战:从踩坑到真香
  • TLDR设计实战:信息过载时代的认知加速协议
  • 基于Java web的健身房会员管理系统的设计与实现
  • Galaxea G0.5 模型解析:从VLA-0到统一自回归序列的实践与思考
  • 30张实拍舰船图+XML/TXT双标注,开箱即用YOLOv5训练
  • 安装KVM服务器、使用libvirt tools工具管理虚拟机
  • 从uint64_t的typedef源码,看懂C语言如何为不同平台(32/64位)定义固定长度类型
  • OPRD:蒸馏不只学答案,还要偷看老师的“脑内活动“
  • 打卡信奥刷题(3369)用C++实现信奥题 P9691 [GDCPC 2023] Base Station Construction
  • 告别CAN的奢侈:一文搞懂LIN总线如何用UART接口搞定汽车低速通信
  • 用两个HC-05蓝牙模块,低成本搭建你的无线PID调参和遥控小车数据链路
  • C#写的CIE1931马蹄图绘制工具,可调画布大小并导出PNG
  • 别再为PLC测试买硬件了!用C#和PLCSIM Advanced V3.0搭建本地仿真环境(附S7NetPlus读写避坑指南)
  • 手写伯努利朴素贝叶斯:从条件概率到对数平滑的完整实现
  • STM32F4/F7上移植SOEM 1.4.0主站:从LAN8720驱动到伺服控制的完整避坑记录
  • 告别手动配IP!用STM32+W5500实现DHCP自动获取网络地址(附完整代码)
  • 给自动驾驶算法工程师的仿真利器:用MATLAB Simulink控制UE4虚拟环境完整流程
  • 8088单板机监控程序解读(四)