多态(Polymorphism)

简介: 多态(Polymorphism)

多态(Polymorphism)
多态是面向对象编程中的一个核心概念,它允许我们以统一的接口来处理不同类型的对象。
在Java中,多态通常通过继承和接口实现。
上面我们知道了多个子类可以通过继承父类来继承父类的属性和方法,然后对父类的方法进行不同的覆盖实现。
多态的原理就是基于类的继承关系:当子类继承父类时,子类会继承父类的所有公有(public)和受保护(protected)的成员变量和方法。
这样,我们就可以使用父类的引用来指向子类的对象,而调用方法时,会根据实际的对象类型来执行相应的方法。
// 父类
class Animal {
public void makeSound() {
System.out.println("动物叫声");
}
}
// 子类
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("汪汪叫");
}
}
// 子类
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("喵喵叫");
}
}

  // 使用多态
  public class Main {
      public static void main(String[] args) {
          Animal dog = new Dog();
          Animal cat = new Cat();
          dog.makeSound(); // 输出:汪汪叫
          cat.makeSound(); // 输出:喵喵叫
      }
  }
  在上面的例子中,我们定义了一个父类 Animal 和两个子类 Dog 和 Cat。
  子类都覆盖了父类的 makeSound 方法。
  我们创建了 Animal 类型的引用,但实际上指向了 Dog 和 Cat 的对象。当我们调用 makeSound 方法时,会根据实际的对象类型来执行相应的方法,这就是多态的概念。
  同样都是makeSound(),但是不同对象调用后就会有不同的实现,狗是汪汪,猫是喵喵。
  还有一种多态的实现,是用接口实现。
  接口是什么呢?
  接口是一种抽象类型,它允许我们定义一组方法,而不需要实现这些方法。
  通过用类来实现接口,类就可以使用接口类型的引用来指向实现接口的类的对象,而调用方法时,会执行类实现的相应方法。
  所以接口就相当于一个父类,但是接口不需要像父类一样有自己的实现:
  // 这样就定义了一个接口。
  interface Flyable {
      //飞
      void fly();
  }
  // 实现接口的类
  class Bird implements Flyable {
      @Override
      public void fly() {
          System.out.println("鸟儿飞翔");
      }
  }
  // 实现接口的类
  class Airplane implements Flyable {
      @Override
      public void fly() {
          System.out.println("飞机飞行");
      }
  }

  // 使用多态
  public class Main {
      public static void main(String[] args) {
          Flyable bird = new Bird();
          Flyable airplane = new Airplane();
          bird.fly(); // 输出:鸟儿飞翔
          airplane.fly(); // 输出:飞机飞行
      }
  }
  我们定义了一个接口 Flyable 和两个实现接口的类 Bird 和 Airplane。在 Main 类中,我们创建了 Flyable 类型的引用,但实际上指向了 Bird 和 Airplane 的对象。当我们调用 fly 方法时,会根据实际的对象类型来执行相应的方法。
目录
相关文章
|
传感器 芯片
数码管显示原理及应用实现介绍1
数码管是一种能够显示数字和简单的字母的显示设备,它由LED(Light Emitting Diode,发光二极管)组成。LED是一种半导体器件,当电流通过它时,会产生光。数码管的每个LED都对应一个数字或字母的形状,通过开启或关闭LED,可以显示所需的数字或字母。 数码管可以分为共阳极和共阴极两种类型。共阳极数码管的所有LED的阳极连接在一起,通过控制每个LED的阴极点亮或熄灭来显示不同的数字或字母。共阴极数码管则相反,将所有LED的阴极连接在一起,通过控制每个LED的阳极点亮或熄灭来显示不同的数字或字母。在实际应用中,常用的是共阳极数码管。 数码管的控制是通过给定不同的输入信号来实现的。
680 0
|
SQL 关系型数据库 MySQL
【Mysql实战】问题分析利器之binlog
在【Mysql-InnoDB 系列】事务提交过程及系列文章中,对mysql(InnoDB引擎)的redolog、undolog、binlog及事务的提交过程有了一些介绍,本篇将尝试去实践binlog在日常操作中的查看、分析方式,以及可能遇到的问题和解决方法。
896 0
|
运维 监控 安全
运维技术——从基础到高阶的全面解析
本文是一篇技术性文章,主要探讨了运维技术。运维不仅仅是保持系统的稳定运行,更包括优化、预防故障和应对突发事件的能力。本文将从运维的基本概念入手,逐步深入到高阶技术和策略,为读者提供一个全面的运维知识体系。希望通过这篇文章,读者能够更好地理解和应用运维技术,提升自己的运维能力。
|
存储 SQL NoSQL
非关系型数据库(NoSQL)
【4月更文挑战第9天】非关系型数据库(NoSQL)是分布式、非结构化、不遵循ACID原则的数据存储系统,常用于大规模数据存储和高并发场景。其类型包括键值对、文档型、列式和图形数据库。与关系型数据库不同,NoSQL数据模型更灵活,适合社交媒体和物联网应用,但在复杂事务处理上不如后者。实际应用中,通常会根据需求选择合适的数据库类型。
515 3
|
11月前
|
弹性计算 Serverless 数据安全/隐私保护
针对【图像生成 - ComfyUI】使用的深度评测
ComfyUI 是一款支持自定义工作流的图像生成工具,适用于创意设计、游戏开发和电商等多个行业。它能根据项目需求灵活调整图像生成流程,提高创意实现效率,同时具备成本效益和弹性伸缩能力,适应业务量变化。尽管如此,ComfyUI 在技术门槛和数据安全方面仍存在挑战,需注意非专业用户的学习曲线和敏感数据保护。
|
JSON API 数据格式
随机头像图片[API盒子官方资源库]免费API接口教程
API盒子提供的头像资源接口,包含大量网络公开收集的头像,适合非商业用途。支持POST/GET请求,需提供用户ID、KEY及返回格式类型。返回数据包括状态码和消息内容,支持JSON/TXT格式。更多详情见API盒子官网。
|
负载均衡 算法 Ubuntu
IPVSADM命令详解及负载均衡配置示例
IPVSADM命令详解及负载均衡配置示例
|
SQL HIVE
【Hive SQL】字符串操作函数你真的会用吗?
本文介绍了SQL中判断字符串是否包含子串的几种方法。`IN`函数判断元素是否完全等于给定元素组中的某项,而非包含关系。`INSTR`和`LOCATE`函数返回子串在字符串中首次出现的位置,用于检测是否存在子串。`SUBSTR`则用于提取字符串的子串。`LIKE`用于模糊匹配,常与通配符配合使用。注意`IN`并非用于判断子串包含。
1296 3
|
数据可视化 前端开发 JavaScript
3分钟,教你搭建一个三维城市建筑可视化系统 ( Cesium 加载 shp 数据 )
3分钟,教你搭建一个三维城市建筑可视化系统 ( Cesium 加载 shp 数据 )
4303 0
3分钟,教你搭建一个三维城市建筑可视化系统 ( Cesium 加载 shp 数据 )
|
存储 安全 编译器
【C++ 多态 】深入理解C++的运行时类型信息(RTTI):dynamic_cast和typeid的应用与原理
【C++ 多态 】深入理解C++的运行时类型信息(RTTI):dynamic_cast和typeid的应用与原理
1268 1