【面向对象】三大特性:多态(重载/覆盖、参数多态/包含多态)

【面向对象】三大特性:多态(重载/覆盖、参数多态/包含多态)
考点频率★★★★★选择题必考是面向对象中最抽象、最易混淆的概念难度⭐⭐⭐⭐建议重点区分“重载 vs 覆盖”和“参数多态 vs 包含多态”这两对概念1️⃣ 多态就是“同一个指令不同的反应”先回顾一下前两篇封装是把数据藏起来继承是子类复用父类的代码。现在有一个新问题假设你写了一个动物类里面有个方法叫()。你继承出了狗和猫。如果你写了一个宠物医院类里面有个方法看病(动物 患者)。这个方法的参数类型是动物但你实际传进去的可能是狗对象也可能是猫对象。当你在方法里调用患者.叫()时你希望狗发出“汪汪”猫发出“喵喵”——同样是“叫”这个指令不同的对象给出了不同的行为。多态Polymorphism就是“一个接口多种实现”——同一个方法名在不同对象身上表现出不同的行为。2️⃣ 多态的两种分类方式软考中多态的考查有两个维度容易混淆。先看框架图多态 ├── 编译时多态静态绑定 │ ├── 重载Overload │ └── 参数多态Parametric Polymorphism——泛型/模板 └── 运行时多态动态绑定 ├── 覆盖/重写Override └── 包含多态Inclusion Polymorphism——子类型3️⃣ 编译时多态静态绑定含义在编译阶段就能确定调用哪个方法。3.1 重载Overload定义在同一个类中多个方法名字相同但参数列表不同参数个数、类型或顺序不同与返回值类型无关。特点发生在一个类内部编译器根据参数列表决定调用哪个版本与返回值类型无关不能仅靠返回值不同来重载示例理解逻辑即可class 计算器 { 加(int a, int b) { return a b; } 加(double a, double b) { return a b; } 加(int a, int b, int c) { return a b c; } }你写加(1, 2)调第一个加(1.0, 2.0)调第二个加(1, 2, 3)调第三个——编译时已经决定了。3.2 参数多态Parametric Polymorphism定义通过泛型Generics如Java或模板Template如C让同一个类或方法可以处理多种不同类型的参数而不需要为每种类型单独写一份代码。特点代码在编译时根据传入的具体类型生成对应的版本类型擦除或模板实例化提高了代码的复用性和类型安全性示例class 盒子T { // T 是类型参数 T 内容; void 放入(T 物品) { 内容 物品; } }你可以创建盒子苹果也可以创建盒子书本——同一份代码适用不同数据类型。4️⃣ 运行时多态动态绑定含义在运行时才能确定调用哪个方法。4.1 覆盖/重写Override定义子类重新定义父类中已有的方法方法名、参数列表、返回值类型完全相同但实现逻辑不同。软考关键点发生在父类和子类之间子类方法的访问权限不能比父类更严格如父类是public子类不能是private子类不能抛出比父类更宽泛的异常软考偶尔涉及示例class 动物 { 叫() { 输出(动物叫) } } class 狗 extends 动物 { 叫() { 输出(汪汪) } // 覆盖了父类的叫() } class 猫 extends 动物 { 叫() { 输出(喵喵) } // 覆盖了父类的叫() }当你写动物 a new 狗(); a.叫();时调用的不是父类的“动物叫”而是子类的“汪汪”——运行时才决定。4.2 包含多态Inclusion Polymorphism定义通过继承和接口实现用父类引用指向子类对象用接口引用指向实现类对象。调用方法时实际执行的是运行时对象类型子类的方法而非引用类型父类的方法。特点是运行时多态的主要实现手段依赖于继承/接口实现和方法覆盖代码更通用可扩展性更强示例动物 a1 new 狗(); // 父类引用指向子类对象 动物 a2 new 猫(); // 父类引用指向子类对象 a1.叫(); // 汪汪 a2.叫(); // 喵喵5️⃣ 两对易混淆概念对比重点表格5.1 重载 vs 覆盖编译时 vs 运行时对比项重载Overload覆盖/重写Override发生位置同一类内父类与子类之间方法名相同相同参数列表必须不同个数/类型/顺序必须相同返回值类型无关不能作为重载依据必须相同或协变返回通常不考访问权限可以不同不能比父类更严格绑定时机编译时静态绑定运行时动态绑定5.2 参数多态 vs 包含多态对比项参数多态包含多态实现手段泛型Generics/模板Template继承 接口 覆盖绑定时机编译时运行时核心问题同一段代码处理不同类型的数据父类引用调用子类对象的方法典型场景ArrayListString、ListT动物 a new 狗(); a.叫();6️⃣ 经典例题例题1下面关于重载和覆盖的叙述中正确的是 。A. 重载发生在父类和子类之间覆盖发生在同一类内B. 重载的方法名必须相同参数列表也必须相同C. 覆盖要求子类方法的访问权限不能比父类更严格D. 覆盖是编译时多态重载是运行时多态解析A说反了——重载在同一类内覆盖在父子类之间B错误——重载参数列表必须不同D说反了——覆盖是运行时重载是编译时。C正确。选C。例题2以下关于包含多态和参数多态的叙述中正确的是 。A. 包含多态通过泛型实现B. 参数多态通过继承和覆盖实现C. 包含多态是运行时多态参数多态是编译时多态D. 参数多态是运行时多态包含多态是编译时多态解析A说反了——参数多态通过泛型实现包含多态通过继承覆盖实现B说反了C正确D说反了。选C。7️⃣ 记忆口诀重载同一类参数必须变编译定版本。覆盖父子间参数不能变运行看对象。泛型模板参数多编译确定不啰嗦。继承接口包含多运行时态把身挪。8️⃣ 小测验评论区对答案在 Java 中class A { void m(int x) {} }class B extends A { void m(int x) {} }。以下说法正确的是 。A. B 中的 m 方法是对 A 中 m 方法的重载B. B 中的 m 方法是对 A 中 m 方法的覆盖C. B 中的 m 方法是对 A 中 m 方法的参数多态D. A 中的 m 方法是编译时多态B 中的 m 方法是运行时多态本专栏日更点击头像 → 专栏《软考中级高频考点》订阅第一时间接收新内容#软考中级 #软件设计师 #多态 #重载 #覆盖 #参数多态 #包含多态 #软考备考