多态的应用体现

多态应用体现笔记

package BxdStudy;

public class DuoTai {
	public static void main(String[] args) {
		/**
		 * 此类来演示多态的效果应用
		 */
		//在这里没有调用,方法直接在DoStudent类里面调用方法了
		DoStudent doStudent = new DoStudent();
		doStudent.doSome(new BaseStudent());
		doStudent.doSome(new AdvStudent());
	}
}

//这个类是使得无论基础生还是优等生都可以调用方法
class DoStudent{
	
	/**
	 * 多态的体现
	 * 无论什么类都可接受
	 * @param student
	 */
	public void doSome(Student student) {
		student.study();
		student.sleep();
	}
	
}

//学生类(抽象的)
abstract class Student{
	
	public abstract void study();
	public void sleep() {
		System.out.println("原学生睡觉");
	}
}

//基础生继承
class BaseStudent extends Student{

	public void study() {
		System.out.println("基础学生的学习ing");	
	}
	public void sleep() {
		System.out.println("基础学生sleeping");
	}
}

//优等生继承
class AdvStudent extends Student{

	public void study() {
		System.out.println("优秀学生的学习ing");	
	}

}

运行结果:
在这里插入图片描述

<think>嗯,用户的问题是关于面向对象编程中的重载和多态的关系以及它们的实现方式。首先,我需要回顾一下这两个概念的定义和它们在OOP中的作用。 重载(Overloading)通常指在同一个作用域内,允许有多个同名方法或函数,但这些方法的参数列表必须不同。比如在同一个类中,可以有多个构造函数,只要它们的参数类型或数量不同。这属于静态多态,也就是编译时多态,因为编译器在编译阶段就能确定调用哪个方法。 多态(Polymorphism)则分为静态多态和动态多态。静态多态包括函数重载和运算符重载,而动态多态通常指通过继承和虚函数实现的运行时多态。动态多态允许子类重写父类的方法,当通过基类指针或引用调用方法时,实际执行的是子类的方法,这需要在运行时确定,因此称为动态。 用户提到的“重载如何在多态体现”,可能是指重载作为多态的一种形式,属于静态多态。需要解释两者的关系,比如重载是编译时的多态,而多态还包括运行时的动态多态。同时,要说明它们的实现方式,比如在C++中,函数重载和虚函数的使用。 接下来,我需要确认参考资料中的内容。引用[2]和[4]提到C++中的重载和多态是OOP的核心特性,引用[4]详细区分了编译时多态(函数重载)和运行时多态(虚函数)。引用[5]举了动物的例子,说明多态的行为根据对象类型不同而变化。这可能帮助举例说明动态多态。 用户可能混淆了重载和覆盖(Override),需要明确两者的区别。重载是同一类中的同名不同参数方法,覆盖是子类重写父类的虚函数。同时,用户可能想了解它们如何共同支持OOP的灵活性和代码复用。 需要组织回答结构,先分别解释重载和多态,再讨论它们的联系与区别,最后给出实现方式的例子,比如C++中的代码示例,说明函数重载和虚函数的使用。同时,注意引用相关资料,比如静态多态和动态多态的分类,以及多态带来的代码设计上的优缺点,如引用[1]提到的性能问题。 最后,生成相关问题,帮助用户进一步学习,比如如何选择重载与多态,或者在Java中的实现方式是否有差异。确保回答清晰,结构合理,符合用户的学习需求。</think>### 重载与多态的关系及实现方式 在面向对象编程(OOP)中,**重载(Overloading)**和**多态(Polymorphism)**是两个核心概念,它们共同支持代码的灵活性和可扩展性,但实现方式和应用场景有所不同。 --- #### 一、重载(Overloading) 1. **定义** 重载指在同一作用域内定义多个同名函数或方法,但其参数列表(参数类型、数量或顺序)必须不同。编译器通过参数列表区分具体调用哪个函数。 **示例(C++):** ```cpp void print(int x) { /*...*/ } // 重载版本1 void print(double x) { /*...*/ } // 重载版本2 void print(const string& s) { /*...*/ } // 重载版本3 ``` 2. **特点** - 属于**静态多态**(编译时多态),编译器在编译阶段确定调用哪个函数[^4]。 - 主要用于简化接口设计,增强代码可读性。 - 可应用于普通函数、类成员函数,甚至是运算符(如`operator+`)[^2]。 --- #### 二、多态(Polymorphism) 多态分为**静态多态**和**动态多态**两类: 1. **静态多态(编译时多态)** - **实现方式**:通过**函数重载**和**模板**实现。 - **示例**: ```cpp // 函数重载 int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } ``` 2. **动态多态(运行时多态)** - **定义**:通过**继承**和**虚函数**实现,允许子类重写父类的方法,程序在运行时根据对象类型决定调用哪个方法[^5]。 - **核心机制**:虚函数表(vtable)和动态绑定。 - **示例(C++):** ```cpp class Animal { public: virtual void sound() { cout << "Animal sound" << endl; } // 虚函数 }; class Dog : public Animal { public: void sound() override { cout << "Bark" << endl; } // 重写父类方法 }; Animal* animal = new Dog(); animal->sound(); // 输出 "Bark"(动态绑定) ``` --- #### 三、重载与多态的关系 1. **联系** - 重载是静态多态的一种实现方式,两者均通过同名函数提供不同行为。 - 动态多态通过重写(Override)实现,而重载通过参数列表区分。 2. **区别** | 特性 | 重载(Overloading) | 多态(Polymorphism) | |--------------------|-----------------------------|-------------------------------| | 绑定时间 | 编译时 | 静态多态:编译时;动态多态:运行时 | | 作用域 | 同一类或作用域 | 跨父子类(继承关系) | | 依赖机制 | 参数列表差异 | 虚函数、继承 | | 灵活性 | 接口简化 | 支持运行时扩展 | --- #### 四、设计意义与注意事项 1. **重载的优势** - 简化接口命名(如`print`支持多种类型输入)。 - 提升代码可读性和维护性。 2. **多态的优势** - 支持开闭原则(扩展开放,修改关闭)[^1]。 - 实现接口统一性(如动物类派生出不同子类,调用统一方法`sound()`)。 3. **潜在问题** - 过度使用多态可能增加代码复杂性(需管理继承层次)。 - 虚函数调用可能引入性能开销(动态绑定需查虚函数表)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值