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

Day57 Java面向对象12 多态

Day56 Java面向对象12 多态

1.多态的定义

多态(Polymorphism):同一个行为(方法),在不同对象上表现出不同的形态

2.多态的条件

①存在继承关系

②子类重写父类方法

③父类引用指向子类对象

父类:Animals
子类:Dog
子类:Cat

//回顾创建对象实例
引用类型 对象实例名 = new 实例类型();Animal dog1 = new Dog();
Animal cat1 = new Cat();
//上面的创建实例方法就是父类引用(Animal) 指向子类对象(Dog,Cat)

3.多态的表现

  • 编译看左边,运行看右边
    ①编译时:a1 和 a2 的类型是 Animal(编译器只看父类有没有 sound 方法)
    ②运行时:a1 实际是 Dog,a2 实际是 Cat,所以a1是汪汪汪,a2是喵喵喵。这就是动态绑定,也是多态的核心
class Animal {public void sound() {System.out.println("动物发出声音");}
}class Dog extends Animal {@Overridepublic void sound() {System.out.println("汪汪汪");}
}class Cat extends Animal {@Overridepublic void sound() {System.out.println("喵喵喵");}
}
public class Test {public static void main(String[] args) {Animal a1 = new Dog(); // 父类引用 -> 子类对象Animal a2 = new Cat();a1.sound(); // 输出:汪汪汪a2.sound(); // 输出:喵喵喵}
}

4.多态的优点

①提高代码复用性: 父类一个统一的方法,子类可以自由拓展

②提高代码可维护性: 通过新增子类就可以拓展功能,不需要修改父类

③低耦合: 调用方只关心父类接口,不需要关注具体实现

5.注意点

①多态是方法的多态,属性没有多态
②多态只能调用父类中拥有的方法,但运行结果由子类决定

③子类中独有,父类没有的方法,无法通过父类引用(父类类型 对象实例名 = new 子类类型();)直接调用
例:

//父类
public class Animals {private String name;public void sound(){System.out.println("动物的叫声");}
}
//子类
public class Bird extends Animals{private String name;@Overridepublic void sound() {System.out.println("喳喳喳");}public void fly(){System.out.println("小鸟飞起来了");}
}
//启动器
public class App {public static void main(String[] args) {Animals a1 = new Bird();a1.sound();   //输出:喳喳喳 a1.fly();   //报错 }
}

解释

父类中存在soud方法,所以父类引用的a1可以调用a1.soud
具体执行来到a1对象类型的Bird,因此soud执行的是输出“喳喳喳”
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
父类中不存在fly方法,所以a1不能直接调用fly方法,系统报错
但可以通用 ((Bird)a1).fly(); 将a1类型强制转换为Bird,再调用fly方法

http://www.dtcms.com/a/341754.html

相关文章:

  • 齐次线性方程组最小二乘解
  • 压缩包密码找回工具递归解压增强版使用说明
  • 机器学习数据预处理学习报告
  • Linux用30秒部署Nginx+Tomcat+Mysql+Jdk1.8环境
  • Paging in Operating System
  • windows server 彻底卸载oracle 11g
  • Linux命令大全-ps命令
  • AdaCoT:基于强化学习的帕累托最优自适应思维链触发机制
  • 自动泊车辅助系统的漏洞、威胁与风险分析
  • MDP(马尔可夫决策过程)与 RL(强化学习)
  • 半导体开关器件深度解析:PNP、NPN、PMOS、NMOS
  • 使用PCL读取PCD点云文件
  • MTK Linux DRM分析(一)- DRM简介
  • 基于STM32的感应开关盖垃圾桶
  • 基于Pytochvideo训练自己的的视频分类模型
  • 数据结构-有序二叉树
  • 中科米堆CASAIM手持式三维扫描仪扫描塑料件检测尺寸形位公差
  • Cobbler:一站式自动化系统部署方案
  • C++高频知识点(三十二)
  • Comfyui加载图像编辑Qwen-Image-Edit工作流之Windows篇
  • C++之多态(从0到1的突破)
  • 【clion】cmake脚本1:调试脚本并构建Fargo项目win32版本
  • python 可迭代对象相关知识点
  • “无纸化办公”加速推进,房产证智能识别技术或成行业标配
  • Linux高效备份:rsync + inotify实时同步
  • 服务器硬盘进行分区和挂载
  • SpringBoot3后端项目介绍:mybig-event
  • 【MySQL的卸载】
  • 5.k8s控制器-Replicaset-Deployment、pod 反亲和性
  • VLN领域的“ImageNet”打造之路:从MP3D数据集、MP3D仿真器到Room-to-Room(R2R)、RxR、VLN-CE