多态(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 方法时,会根据实际的对象类型来执行相应的方法。
目录
相关文章
|
11月前
|
消息中间件 存储 缓存
招行面试:如何让系统抗住双十一 预约抢购活动?10Wqps级抢购, 做过吗?
本文由40岁老架构师尼恩撰写,针对一线互联网企业如得物、阿里、滴滴等的面试题进行深度解析。文章聚焦于如何设计系统以应对大促活动中的预约抢购场景,涵盖从预告到支付的完整流程。尼恩通过系统化、体系化的梳理,帮助读者提升技术实力,轻松应对高并发挑战,并提供了详细的架构设计和解决方案。文中还分享了《尼恩Java面试宝典》等资源,助力求职者在面试中脱颖而出,实现“offer直提”。更多内容及PDF资料,请关注公众号【技术自由圈】获取。
|
数据采集 存储 数据处理
数据治理:如何制定数据标准与规范
在当今这个数据驱动的时代,数据已成为企业最宝贵的资产之一。然而,随着数据量的爆炸性增长和数据来源的多样化,如何有效地管理和利用这些数据成为了企业面临的重大挑战。数据治理作为确保数据质量、安全性、合规性和可访问性的关键过程,其核心在于制定并执行一套科学、合理的数据标准与规范。本文将探讨如何制定数据标准与规范,以推动企业的数据治理实践。
2026 3
|
计算机视觉
【图像处理】 Halcon 实现图像亚像素边缘检测
如何在Halcon软件中实现图像亚像素边缘检测,包括读取图片、图像阈值化、边界提取、区域扩张、亚像素边缘提取、轮廓拟合和彩色绘图等步骤,并提供了相应的Halcon代码实现和检测效果展示。
581 2
|
机器学习/深度学习
生物神经元与人工神经元
生物神经元与人工神经元
471 13
|
监控 安全 数据安全/隐私保护
|
Linux Windows
【Linux】rzsz——本地Windows与云端Linux文件传输工具
【Linux】rzsz——本地Windows与云端Linux文件传输工具
307 0
|
机器学习/深度学习 并行计算 编译器
MXNet安装教程:详细步骤与常见问题解析
【4月更文挑战第12天】本文详细介绍了MXNet深度学习框架的安装步骤,包括Python、conda和R用户的安装方法,以及GPU支持的选项。在安装过程中可能遇到网络问题、依赖冲突和GPU支持问题等,文中给出了相应解决策略。安装后,通过简单的代码示例验证MXNet是否正常工作,从而顺利完成本地环境搭建。
2495 7
|
编译器 C++
类与对象(三)--构造函数体中的赋值和初始化列表的区别
类与对象(三)--构造函数体中的赋值和初始化列表的区别
|
存储 关系型数据库 MySQL
MySQL基础入门:数据库操作全攻略
MySQL基础入门:数据库操作全攻略
1052 0
|
Java Spring
深入解析 Java @RequestParam 注解:处理请求参数的高效利用
在Java Web应用开发中,获取客户端传递的请求参数是非常常见的操作。Spring框架为我们提供了多种方式来处理请求参数,其中 @RequestParam 注解是一种常用且灵活的方式。本文将带您深入了解 @RequestParam 注解,探讨其特点、用法、实现方式以及在实际应用中的优势。