news 2026/6/10 15:39:46

基于多态的相关知识点(封装、继承、多态)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于多态的相关知识点(封装、继承、多态)

一、多态的基本概念

1. 定义

· 多态(Polymorphism)指同一操作作用于不同类的对象时,可以有不同的解释和执行结果
· "多种形态":同一接口,不同实现

2. 分类

· 编译时多态(静态多态)
· 方法重载(Overloading)
· 运算符重载
· 运行时多态(动态多态)
· 方法重写/覆盖(Overriding)
· 基于继承和接口实现

二、静态多态(编译时多态)

1. 方法重载(Overloading)

```java
class Calculator {
// 方法名相同,参数列表不同
public int add(int a, int b) {
return a + b;
}

public double add(double a, double b) {
return a + b;
}

public int add(int a, int b, int c) {
return a + b + c;
}
}
```

2. 运算符重载(部分语言支持)

```cpp
class Vector {
public:
Vector operator+(const Vector& other) {
// 重载+运算符
}
};
```

三、动态多态(运行时多态)

1. 方法重写/覆盖(Overriding)

```java
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("喵喵喵");
}
}
```

2. 实现条件

· 继承关系
· 方法重写
· 父类引用指向子类对象(向上转型)

```java
Animal myAnimal = new Dog(); // 向上转型
myAnimal.makeSound(); // 输出"汪汪汪"
```

四、多态的实现机制

1. 虚函数(C++)

```cpp
class Base {
public:
virtual void show() { // 虚函数
cout << "Base show" << endl;
}
};

class Derived : public Base {
public:
void show() override {
cout << "Derived show" << endl;
}
};
```

2. 虚函数表(vtable)

· C++通过虚函数表实现动态绑定
· 每个有虚函数的类都有一个虚函数表
· 对象包含指向vtable的指针

3. Java/C#的实现

· Java中所有非private、非static、非final方法都是虚方法
· 通过方法表实现
· final关键字可以禁止方法被重写

五、接口与抽象类的多态

1. 接口多态

```java
interface Shape {
double area();
}

class Circle implements Shape {
public double area() {
return Math.PI * radius * radius;
}
}

class Rectangle implements Shape {
public double area() {
return width * height;
}
}

// 使用
Shape shape1 = new Circle();
Shape shape2 = new Rectangle();
```

2. 抽象类多态

```java
abstract class Employee {
abstract double calculateSalary();
}

class Manager extends Employee {
double calculateSalary() {
return baseSalary + bonus;
}
}
```

六、多态的应用场景

1. 设计模式中的应用

· 工厂模式
· 策略模式
· 模板方法模式
· 命令模式

2. 实际应用

```java
// 支付系统多态示例
interface Payment {
void pay(double amount);
}

class CreditCardPayment implements Payment {
public void pay(double amount) {
// 信用卡支付逻辑
}
}

class PayPalPayment implements Payment {
public void pay(double amount) {
// PayPal支付逻辑
}
}

class PaymentProcessor {
public void processPayment(Payment payment, double amount) {
payment.pay(amount); // 多态调用
}
}
```

七、多态的优势

1. 提高代码可扩展性

· 新增子类不影响现有代码

2. 提高代码复用性

· 父类定义通用接口

3. 提高代码灵活性

· 运行时决定调用哪个方法

4. 实现接口统一

· 不同对象通过统一接口访问

八、相关概念对比

特性 重载 (Overload) 重写 (Override)
发生位置 同一类中 父子类之间
参数列表 必须不同 必须相同
返回类型 可以不同 相同或协变
访问权限 无限制 不能更严格
发生阶段 编译时 运行时

九、注意事项

1. 构造器不能多态

· 构造器是隐式static的,不具备多态性

2. 静态方法不能多态

```java
class Parent {
static void show() {
System.out.println("Parent");
}
}

class Child extends Parent {
static void show() { // 隐藏,不是重写
System.out.println("Child");
}
}

Parent p = new Child();
p.show(); // 输出"Parent",静态方法调用取决于引用类型
```

3. 字段不能多态

```java
class Parent {
String name = "Parent";
}

class Child extends Parent {
String name = "Child"; // 隐藏父类字段
}

Parent p = new Child();
System.out.println(p.name); // 输出"Parent"
```

十、面试常见问题

1. 多态的实现原理是什么?
· C++:虚函数表
· Java:方法表
2. 重载和重写的区别?
· 编译时 vs 运行时
· 同一类 vs 继承关系
· 参数列表不同 vs 相同
3. 如何防止方法被重写?
· C++:使用final关键字(C++11)
· Java:使用final修饰方法
· C#:使用sealed关键字
4. 多态的性能影响?
· 轻微的性能开销(虚函数调用)
· 现代优化技术(如内联缓存)减少了开销

总结

多态是面向对象编程的核心特性,它通过:

· 静态多态提高代码的灵活性
· 动态多态提高系统的扩展性和可维护性

理解多态的关键在于掌握:

1. 向上转型
2. 动态绑定机制
3. 接口和抽象类的使用
4. 多态在设计模式中的应用

多态使得程序更加模块化,降低了模块间的耦合度,是构建大型、可维护软件系统的重要基础。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 15:17:47

Flyway库,深度详解

Flyway 是一个用于管理数据库结构变更的版本控制工具。它通过脚本文件记录数据库的每一次变更&#xff0c;确保在不同环境&#xff08;开发、测试、生产&#xff09;中数据库结构能一致、可靠地演进。可以把数据库想象成一栋不断装修扩建的房子。Flyway 就像是这栋房子的施工蓝…

作者头像 李华
网站建设 2026/6/10 15:20:30

Openpyxl 库解析

1. 它是什么 Openpyxl 是一个用于读写 Microsoft Excel 2010 及以上版本文件&#xff08;即 .xlsx 格式&#xff09;的 Python 库。它不依赖 Excel 软件本身&#xff0c;可以直接在代码中操作电子表格文件。可以将其理解为一个专门的“翻译官”或“操作员”&#xff0c;负责在 …

作者头像 李华
网站建设 2026/6/6 12:12:57

《P2839 [国家集训队] middle》

题目描述一个长度为 n 的序列 a&#xff0c;设其排过序之后为 b&#xff0c;其中位数定义为 bn/2​&#xff0c;其中 a,b 从 0 开始标号&#xff0c;除法下取整。给你一个长度为 n 的序列 s。回答 Q 个这样的询问&#xff1a;s 的左端点在 [a,b] 之间&#xff0c;右端点在 [c,d…

作者头像 李华
网站建设 2026/5/31 0:32:58

实时人脸美型功能开发技术挑战:美颜sdk在性能与效果间的取舍

在短视频、直播、视频社交全面爆发的今天&#xff0c;“实时人脸美型”已经从锦上添花&#xff0c;变成了很多产品的基础能力。 用户打开摄像头的第一秒&#xff0c;就在无意识中对美颜效果做出了判断&#xff1a; 顺不顺&#xff1f;像不像我&#xff1f;会不会卡&#xff1f…

作者头像 李华
网站建设 2026/6/10 15:08:18

基于SpringBoot的画师约稿平台毕业设计

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于SpringBoot框架的画师约稿平台&#xff0c;以满足现代数字艺术创作与市场需求之间的对接需求。具体研究目的如下&#xff1a; 首先…

作者头像 李华
网站建设 2026/6/6 11:39:58

基于python调用javascrpt代码:学习笔记

PyExecJS简介 pyexecjs是一个python的库&#xff0c;用于python环境中调用执行javascript代码。对于爬虫逆向来说&#xff0c;这个库是非常合适的。 前期准备 我们需要提前去下载安装node.js node.js官网下载地址&#xff1a;Node.js — 下载 Node.js # 验证 Node.js 版本…

作者头像 李华