一、多态分类(必考概念)
1. 静态多态(编译期多态)
程序编译阶段就确定调用哪个方法
包含:函数重载、运算符重载
2. 动态多态(运行期多态)
程序运行阶段才动态确定调用哪个方法
依靠:继承 + virtual/override 重写、抽象类、接口实现
二、函数重载(静态多态核心)
1. 函数重载满足的三个硬条件(必须全背)
-
① 方法名必须完全相同
-
② 参数个数 或 参数类型 或 参数顺序不同
-
③ 仅返回值不同,不构成重载(超级易错)
2. 你代码中所有合法重载案例
// 1.无参数
public static void F1()
// 2.一个int参数(参数类型不同)
public static void F1(int a)
// 3.一个string参数(参数类型不同)
public static void F1(string a)
// 4.string+int 两个参数(个数不同)
public static void F1(string a,int b)
// 5.int+string 顺序不同(参数顺序不同,构成重载)
public static void F1(int b,string a)
// 6.bool参数(类型不同,虽然返回值不同,但依然构成重载)
public static int F1(bool b)
三、重点解析:返回值不影响重载
正确理解
判断是否为重载,只看参数列表,和返回值、修饰符无关。
你代码中:
void F1(int) 和 int F1(bool)
之所以是重载,是因为参数类型不同,不是因为返回值不同。
致命错误(考试最爱考)
public void F1(int a)
public int F1(int a)
// ❌ 不构成重载!仅仅返回值不同,参数一模一样,直接报错
四、参数顺序不同也构成重载
这是很多同学的盲区:
F1(string a, int b)
F1(int b, string a)
// ✅ 参数列表顺序不同,属于合法重载
五、完整可运行整理代码
namespace _9多态_函数重载
{
internal class Program
{
static void Main(string[] args)
{
// 自动匹配不同重载方法
F1();
F1(10);
F1("测试");
F1("aa", 100);
F1(200, "bb");
F1(true);
}
#region 函数重载组
public static void F1()
{
Console.WriteLine("F1不带参数");
}
public static void F1(int a)
{
Console.WriteLine("F1带一个int参数");
}
public static void F1(string a)
{
Console.WriteLine("F1带一个string参数");
}
public static void F1(string a, int b)
{
Console.WriteLine("F1带俩个参数(string+int)");
}
public static void F1(int b, string a)
{
Console.WriteLine("F1带俩个参数(int+string)");
}
public static int F1(bool b)
{
Console.WriteLine("F1带1个bool参数");
return 10;
}
#endregion
}
}
六、考试简答题满分模板
1. 什么是函数重载?
在同一个类中,方法名相同,参数列表(个数、类型、顺序)不同的多个方法,称为函数重载。函数重载属于静态多态,在编译阶段确定调用方法,仅返回值不同不构成重载。
2. 多态分为哪两种?
分为静态多态和动态多态。静态多态通过函数重载、运算符重载实现,编译期绑定;动态多态通过继承和方法重写实现,运行期绑定。
七、终极背诵口诀
重载三要:同名、参不同、返回随便行
参不同三情况:个数、类型、顺序换
只改返回不算数,编译报错不能用
重载属于静态态,编译绑定不用等
------------------------运算符重载------------------------------
一、运算符重载核心概念
运算符重载 :重新定义系统运算符的运算逻辑,让自定义类的对象支持加减、自增、大小比较等运算。
作用:默认对象不能直接做运算,重载运算符后,可实现 对象+对象、对象>对象、对象++ 等操作。
归属:属于 静态多态(编译期多态)
二、运算符重载固定语法(死格式、必须背)
public static 返回值类型 operator 运算符(参数1,参数2)
{
// 自定义运算逻辑
}
强制规则:
-
必须是 public static 修饰,缺一不可
-
必须使用 operator 关键字
-
参数个数固定:双目运算符2个参数,单目运算符1个参数
三、本案例业务逻辑说明
自定义箱子类 Box,包含长宽高、体积属性
-
+重载:两个箱子长宽高分别相加,返回新箱子对象 -
-重载:两个箱子体积相减,返回int差值 -
++重载:箱子长宽高各自+1,返回新对象 -
> <重载:根据箱子体积做大小比较,返回布尔值
四、逐段重载代码解析
1. 加号 + 重载(双目运算符)
public static Box operator+(Box b1,Box b2)
{
return new Box()
{
Length = b1.Length + b2.Length,
Width = b1.Width + b2.Width,
Height = b1.Height + b2.Height
};
}
功能:两个Box对象属性分别相加,返回全新Box对象
调用:Box b3 = b1 + b2;
2. 减号 - 重载(返回值类型灵活)
public static int operator-(Box b1,Box b2)
{
return b1.Length * b1.Width * b1.Height - b2.Length * b2.Width * b2.Height;
}
重点:和加号不同,这里返回 int 体积差值,不一定非要返回本类对象
调用:int b4 = b1 - b2;
3. 自增 ++ 重载(单目运算符)
public static Box operator++(Box b1)
{
return new Box()
{
Length = b1.Length + 1,
Width = b1.Width + 1,
Height = b1.Height + 1,
};
}
特点:只有一个参数,返回新对象(原对象不变)
执行结果解析:
-
b5 = b1++ -
b5 保存 自增前 的旧数据(Length=10)
-
b1 变为自增后新数据(Length=11)
4. 大于、小于比较重载
//重载大于
public static bool operator>(Box b1,Box b2)
{
return b1.Volume > b2.Volume;
}
//重载小于
public static bool operator <(Box b1, Box b2)
{
return b1.Volume < b2.Volume;
}
规则:成对重载,不能只重载一个
逻辑:不再比较对象地址,而是自定义比较体积大小
五、程序完整输出结果
40:60:80 (b1+b2 长宽高相加结果)
10400 (体积差值)
11 (自增后b1)
10 (自增前赋值给b5)
False (b1体积不大于b2)
True (b1体积小于b2)
六、必考语法坑点(易错)
-
运算符重载方法必须 public static,缺一报错
-
双目运算符必须传 两个参数 ,单目运算符传 一个参数
-
比较运算符
> < == !=必须成对重载 -
重载只是重写运算逻辑,不会改变运算符优先级
-
自增重载:默认返回新对象,原对象数据不直接修改
-
返回值不固定:可以返回对象、int、bool 任意类型
七、简答题满分模板
1. 什么是运算符重载?
运算符重载属于静态多态,通过operator关键字重新定义运算符的运算规则,让自定义类型对象支持运算符运算,提升代码的可读性与灵活性,在编译阶段确定执行逻辑。
2. 运算符重载的语法要求?
必须使用public static修饰,通过operator关键字搭配运算符实现重载,双目运算符需要两个参数,单目运算符需要一个参数,比较运算符需要成对重载。
八、终极背诵口诀
运算符重载静态态,public static不能带
operator接符号,参数个数分单双
比较符号要成对,自定义规则对象算
编译绑定静态态,多态复用更简单