让你理解多态

多态与对象转型详解

多态

基本介绍

多态的前提是:两个对象(类)存在继承关系
方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承基础上的

静态多态(方法的重载)

这就是简单的多态
public int add(int a,int b){return a + b; }
public int add(int a,int b,int c){ return a+b+c}
public double add(double a, int b){ return a+b}

对象的多态

  • 一个对象的编译类型和运行类型可以不一致
  • 编译类型在定义对象时,就确定了 不可以改变
  • 运行类型可以变化的
  • 编译类型看定义时 = 号的左边,运行类型看 =号的右边
    Animal animal = new Dog();

animal的编译类型是Animal,运行类型是Dog对象

细节

向上转型
向上转型调用方法的规则:

  • 可以调用父类中的所有成员(需要遵循访问权限)
  • 不能调用子类特有的成员方法(就是父类没有的,而子类却有的方法是不能通过父类的引用指向去调用那个方法)
  • 在编译阶段,能调用哪些成员,是由编译类型来决定的
  • 最终运行效果还是要看子类的具体实现,就是调用方法,按照从子类开始查找,然后调用,规则与继承方法的规则一致
    本质:父类的引用指向了子类的对象
    语法:父类类型 引用名 = new 子类类型();
    特点:编译看类型的左边,运行看类型右边
public class Person {//父类或基类

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

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

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

    public void run(){
        System.out.println("Person 的run");
    }

    public void play(){
        System.out.println("Person 的play");
    }
}

子类

package com.fgw.Test;

public class Son extends Person{

    public void run(){
        System.out.println("我是子类的run方法");
    }

    public void eat(){
        System.out.println("我是子类特有的eat方法");
    }
}

测试方法

package com.fgw.Test;

public class Main {
    public static void main(String[] args) {

        /**
         * 向上转型
         * 就是父类的引用指向子类的对象
         * 在编译时看左边的引用,实际执行而是看右边的对象
         * 通过父类的引用时只能执行父类中或者子类重写了的方法不能调用子类特有的方法
         * */
        Son son = new Son();
        Person s = new Son();
        son.eat();
        //s.eat();
        s.run();s.play();
    }
}

### 多态的定义 多态(Polymorphism)源自希腊语,意为“多种形态”。在编程中,它是一种通过统一接口操作不同类型的对象的能力,使得程序能够以更灵活和可扩展的方式处理不同类型的对象[^1]。多态通常分为两种类型:编译时多态(静态多态)和运行多态(动态多态)。 --- ### 编译时多态(静态多态) 编译时多态主要通过函数重载(Function Overloading)或运算符重载实现。在编译阶段,根据参数的不同决定调用哪个方法。 #### 应用示例 ```cpp // 函数重载示例 void print(int value) { std::cout << "Integer: " << value << std::endl; } void print(double value) { std::cout << "Double: " << value << std::endl; } int main() { print(5); // 调用 int 版本 print(5.0); // 调用 double 版本 return 0; } ``` 上述代码展示了如何通过函数重载实现编译时多态[^2]。 --- ### 运行多态(动态多态运行多态通过继承和虚函数实现,允许程序在运行时根据对象的实际类型调用相应的方法。这种机制通常用于实现面向对象编程中的类层次结构。 #### 应用示例 ```cpp // 动态多态示例 class Animal { public: virtual void sound() { std::cout << "Animal makes sound" << std::endl; } virtual ~Animal() {} // 虚析构函数确保正确释放资源 }; class Dog : public Animal { public: void sound() override { std::cout << "Dog barks" << std::endl; } }; int main() { Animal* myDog = new Dog(); myDog->sound(); // 输出 "Dog barks",体现运行多态 delete myDog; return 0; } ``` 上述代码展示了如何通过虚函数实现运行多态[^4]。 --- ### 模板实现编译时多态 模板是 C++ 中的泛型编程机制,能够在编译时生成针对不同类型的具体实现,从而实现类似多态的效果。 #### 应用示例 ```cpp // 函数模板示例 template<typename T> void draw(T& shape) { shape.draw(); } class Circle { public: void draw() { std::cout << "Drawing a circle using template." << std::endl; } }; class Rectangle { public: void draw() { std::cout << "Drawing a rectangle using template." << std::endl; } }; int main() { Circle circle; Rectangle rectangle; draw(circle); // 调用 Circle 的 draw 方法 draw(rectangle); // 调用 Rectangle 的 draw 方法 return 0; } ``` 模板机制提供了另一种形式的编译时多态,称为参数化多态[^3]。 --- ### 多态的应用场景 1. **图形用户界面(GUI)开发**:通过多态机制,可以为不同的控件(如按钮、文本框等)提供统一的事件处理接口。 2. **游戏开发**:在游戏中,不同的角色可能有不同的行为(如攻击、移动等),但可以通过多态统一处理这些行为。 3. **插件系统**:通过多态,可以设计一个通用的插件接口,支持多种类型的插件扩展。 4. **日志记录**:使用多态的日志记录系统可以根据不同的日志级别输出到不同的目标(如文件、控制台等)。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值