C# 多态与函数重载(静态多态)

一、多态 核心概念

多态:同一个功能,拥有不同的实现形态

C# 多态分为两大类:

1. 静态多态(编译时多态)

程序编译阶段就确定调用哪个方法

包含:函数重载、运算符重载

2. 动态多态(运行时多态)

程序运行阶段动态确定调用哪个方法

依靠:继承 + 虚方法重写 / 接口 / 抽象类实现

静态多态 :在编译过程中,通过方法重载和运算符重载来实现,也称之为静态绑定和早期绑定

动态多态 :在运行过程中,通过方法重写,隐藏方法来实现,也称之为动态绑定或者后期绑定


二、函数重载(静态多态核心)

1. 函数重载满足的三个硬性条件(必考)

  1. 方法名必须完全一致

  2. 参数列表必须不同:参数个数不同 / 参数类型不同 / 参数顺序不同

  3. 仅返回值不同,不构成重载(超级高频坑点)

2. 核心原理

编译器根据 方法名 + 参数列表 区分不同方法,实现"同名不同功能"的多态效果。


三、代码逐行解析(合法重载案例)

cs 复制代码
// 1. 无参方法
public static void F1()
{
    Console.WriteLine("F1不带参数");
}

// 2. 参数个数不同 = 构成重载
public static void F1(int a)
{
    Console.WriteLine("F1带一个参数");
}

// 3. 参数类型不同 = 构成重载
public static void F1(string a)
{
    Console.WriteLine("F1带一个参数");
}

// 4. 参数个数不同 = 构成重载
public static void F1(string a, int b)
{
    Console.WriteLine("F1带俩个参数");
}

// 5. 参数顺序不同 = 构成重载
public static void F1(int b, string a)
{
    Console.WriteLine("F1带俩个参数");
}

// 6. 参数类型不同,返回值不同 = 依然构成重载(看参数不看返回值)
public static int F1(bool b)
{
    Console.WriteLine("F1带1个参数");
    return 10;
}

所有以上方法 全部是合法重载

区分依据:参数个数、类型、顺序存在差异,满足重载条件。


四、超级易错考点(笔试必考坑)

❌ 非法重载:仅返回值不同

以下代码 报错,不构成重载

cs 复制代码
public static void F1(int a)
{

}
// 错误!仅仅返回值不一样,参数列表完全一致,不是重载
public static int F1(int a)
{
    return 10;
}

重点结论 :返回值、修饰符、参数名 都不参与重载判定!

✅ 合法重载:参数顺序不同

F1(int,string)F1(string,int) 是两个不同的参数列表,属于合法重载。


五、重载判定终极规则

两个方法是否是重载,只看参数列表

  • 参数个数不同 → 重载

  • 参数类型不同 → 重载

  • 参数顺序不同 → 重载

  • 仅返回值不同 → 不是重载

  • 仅参数名不同 → 不是重载


六、静态多态特点

  • 编译时就绑定方法,执行效率高

  • 方法名相同,参数列表不同,实现多种形态

  • 不需要继承、不需要重写,同类中即可实现


七、满分背诵口诀

  • 多态分两种,静态靠重载,动态靠重写

  • 重载三条件:同名、参不同、不看返回值

  • 参个数、类型、顺序,任一不同即重载

  • 只改返回不算数,编译报错记清楚

相关推荐
CTA终结者1 小时前
期货量化环境装不上怎么办:天勤 TqSdk 安装与 Python 版本排查
开发语言·python
SilentSamsara1 小时前
Python 与 Docker:多阶段构建、最小镜像与健康检查
运维·开发语言·python·docker·中间件·容器
变量未定义~1 小时前
快速幂、费马小定理、约数的个数、欧拉函数模板、矩阵快速幂
开发语言
hyunbar1 小时前
NOT IN 的 NULL 陷阱:一次 UNION 数据“神秘消失“
开发语言·sql
C+++Python1 小时前
如何在 Java 中使用 BIO、NIO 和 AIO?
java·开发语言·nio
189228048611 小时前
NV022固态MT29F16T08GWLCEM5-QBES:C
c语言·开发语言
划水的code搬运工小李2 小时前
下载CSDN到PDF
开发语言·pdf·swift
不负岁月无痕2 小时前
STL-- C++ stack_queue _priority_queue类 模拟实现
开发语言·c++
半个烧饼不加肉2 小时前
JS 底层探究--上下文
开发语言·javascript·ecmascript