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

Java面向对象之多态

多态这个词来源于希腊语,意为“多种形态”。简单来说,多态允许我们使用一个父类引用来指向其子类对象,从而在运行时动态地决定调用哪个方法。
假设我们有一个父类 Person,它有三个子类:StudentTeacherWorker,现在写一个方法sayHello(),如果不用多态,我们只能写成这样:

// 方法1: 针对学生
public void greet(Student student) {student.sayHello();
}// 方法2: 针对老师
public void greet(Teacher teacher) {teacher.sayHello();
}// 方法3: 针对工人
public void greet(Worker worker) {worker.sayHello();
}

每增加一种新的人物类型,就必须再写一个新方法。这会导致代码冗余、难以维护,并且无法通用。

多态的出现正是为了解决这个问题。它允许我们创建一个通用的方法,只接受Person类型的参数,而不管传入的实际对象是Student、Teacher还是Worker。

多态的前提

要实现多态,必须满足三个条件:

  1. 继承:子类继承父类。
  2. 方法重写:子类重写父类的方法。
  3. 父类引用指向子类对象。

多态的语法:父类引用指向子类对象

// 标准的创建对象语法
Dog myDog = new Dog(); // myDog的引用类型和实际对象类型都是Dog// 多态的创建对象语法
Animal myAnimal = new Dog(); // myAnimal的引用类型是Animal,但实际对象类型是Dog

示例代码:动物吃东西

// 父类:Animal.java
class Animal {public void eat() {System.out.println("Animal is eating.");}
}// 子类1:Dog.java
class Dog extends Animal {@Overridepublic void eat() {System.out.println("The dog is eating dog food.");}
}// 子类2:Cat.java
class Cat extends Animal {@Overridepublic void eat() {System.out.println("The cat is eating fish.");}
}// 主程序:Main.java
public class Main {public static void main(String[] args) {// 父类引用指向子类对象Animal myDog = new Dog();Animal myCat = new Cat();// 调用相同的方法,但输出结果不同myDog.eat(); // 输出: The dog is eating dog food.myCat.eat(); // 输出: The cat is eating fish.// 我们还可以创建一个通用的方法来处理makeAnimalEat(myDog); // 输出: The dog is eating dog food.makeAnimalEat(myCat); // 输出: The cat is eating fish.}public static void makeAnimalEat(Animal animal) {// 在运行时,JVM会根据实际的对象类型来调用对应的方法animal.eat();}
}

在编译阶段,编译器只知道 myDogmyCatAnimal 类型;当调用eat()方法时,Java虚拟机(JVM)会根据实际创建的对象类型(即new Dog()new Cat())来决定执行哪个版本的eat()方法。

多态的两种形式

多态通常分为两种类型:

  • 编译时多态(静态多态):主要指方法重载(Overloading)。它在编译阶段就已经确定了调用哪个方法。例如,同一个类中可以有多个同名但参数列表不同的方法。

  • 运行时多态(动态多态):这才是我们通常所说的多态,通过方法重写(Overriding)和父类引用指向子类对象实现。它在程序运行时才能确定调用哪个方法。

多态的优点

  • 可扩展性:当需要添加新的子类时(比如添加一个Bird类),我们只需要让它继承Animal并重写eat()方法即可,无需修改其他现有代码,makeAnimalEat()方法依然可以正常工作。

  • 可维护性:它简化了代码的复杂性。你可以用一个统一的接口(父类)来处理多种不同的对象,而不用写一大堆if-else或switch语句来判断对象的具体类型。

  • 代码简洁性:它允许我们编写更加通用和抽象的代码。

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

相关文章:

  • 量子计算学习续(第十五周周报)
  • Docker 入门与实践:从零开始掌握容器化技术
  • 个人用户无公网 IP 访问群晖 NAS:神卓 N600 的安全便捷方案(附踩坑经验)
  • Cpolar内网穿透实战:从零搭建远程访问服务
  • 【Python精讲 03】Python核心容器:一篇通关序列(List, Tuple)、映射(Dict)与集合(Set)
  • map_from_arrays和map_from_entries函数
  • 【EE初阶 - 网络原理】网络基本原理
  • 计算机毕设选题+技术栈选择推荐:基于Python的家教预约管理系统设计
  • 密码实现安全:形式化验证技术解析及主流工具实践
  • 并发编程的“造物主“函数——`pthread_create`
  • Python如何开发游戏
  • 新手向 算法 插入排序-yang
  • 2.0、机器学习-数据聚类与分群分析
  • 无痛c到c++
  • QTableWidget 控件入门
  • 【HarmonyOS】HMRouter配置与基本使用
  • 数据驱动下的实验设计与方差分析:从技术落地到方法论升维
  • 深度学习中的池化、线性层与激活函数
  • 【脑电分析系列】第22篇:EEG情绪识别与脑机接口(BCI)应用案例:机器学习与深度学习的实战
  • 深度学习知识点
  • 【pdf】如何将网页转换为pdf?
  • 家庭劳务智能机器人:从“科幻设想”到“推门而入”还有多远?
  • C++后台开发工具链实战
  • PortAudio--Cross-platform Open-Source Audio I/O Library
  • Oracle根据日期进行查询
  • 【C#】C# 中 `ProcessStartInfo` 详解:启动外部进程
  • Python快速入门专业版(三十六):Python列表基础:创建、增删改查与常用方法(15+案例)
  • 微服务项目->在线oj系统(Java-Spring)----5.0
  • 【读书笔记】《鲁迅传》
  • Python 基础:列表、字符串、字典和元组一些简单八股