当前位置: 首页 > article >正文

Java 多态的理解

Java 多态的理解

多态 是面向对象编程的重要特性之一,它允许同一个方法调用在不同对象上具有不同的行为。多态提高了代码的灵活性和可维护性,是 Java 继承机制和动态绑定的核心体现。


什么是多态?

  • 定义:多态指相同的引用类型变量在运行时可以表示不同的实际对象,不同的对象表现出不同的行为。
  • 核心机制
    • 继承:子类继承父类的属性和方法。
    • 方法重写:子类可以重写父类的方法,以提供自己的实现。
    • 动态绑定:方法调用在运行时绑定到实际的实现,而不是编译时绑定到引用的类型。

多态的两种形式

1. 编译时多态(静态多态)
  • 实现方式:通过 方法重载(Overloading)。
  • 原理
    • 方法重载是指在同一个类中,方法名相同,但参数的数量、类型或顺序不同。
    • 在编译时,编译器根据参数列表来选择调用哪个方法。
  • 特点
    • 方法调用在 编译阶段 决定。
    • 属于 静态绑定

示例

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

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

public class Main {
    public static void main(String[] args) {
        Calculator calc = new Calculator();
        System.out.println(calc.add(5, 10));  // 调用 add(int, int)
        System.out.println(calc.add(5.5, 10.5));  // 调用 add(double, double)
    }
}
2. 运行时多态(动态多态)
  • 实现方式:通过 方法重写(Overriding)。
  • 原理
    • 子类对父类方法进行重写,并将子类对象赋值给父类引用。
    • 在运行时,根据实际对象的类型调用重写的方法,而不是根据引用类型。
  • 特点
    • 方法调用在 运行阶段 决定。
    • 属于 动态绑定

示例

class Animal {
    public void sound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Dog barks");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();  // 父类引用指向子类对象
        animal.sound();  // 输出 "Dog barks"
    }
}

什么是引用类型?

  • 定义:引用类型是变量类型的一种,指向对象的内存地址,而不是存储具体的值。引用类型包括类、接口、数组等。
  • 特点
    • 通过引用变量可以访问对象的属性和方法。
    • 同一个引用变量可以指向不同的实际对象(多态的基础)。
  • 代码示例
Animal animal = new Dog();  // 父类引用指向子类对象
  • animal 是一个 引用类型变量,其类型为 Animal,但实际指向的对象是 Dog 的实例。

动态多态的运行机制

  1. 编译阶段:编译器只检查 animal 的类型是否是 Animal,确保 sound() 方法存在。
  2. 运行阶段:JVM 根据 animal 实际指向的对象(Dog 实例)来调用对应的 sound() 方法。

关键点

  • 方法调用时,JVM 根据实际对象的类型来决定调用哪个方法。
  • 引用类型只决定变量可调用的方法,但最终的执行由对象类型决定。

静态多态与动态多态的比较

特性编译时多态(静态多态)运行时多态(动态多态)
实现方式方法重载方法重写
绑定时间编译时绑定(静态绑定)运行时绑定(动态绑定)
决定依据方法参数的类型、数量或顺序对象的实际类型
优点编译时效率高提高代码的灵活性和可扩展性
示例add(int a, int b) vs add(double a, double b)父类引用调用子类重写的方法

小结

  1. 多态的核心在于动态绑定:同一个引用在运行时表现出不同对象的行为特征。
  2. 静态多态 是方法重载,编译时确定调用。
  3. 动态多态 是方法重写,运行时确定调用。
  4. 引用类型 是多态的基础,通过父类引用指向子类对象实现运行时多态。

http://www.kler.cn/a/441919.html

相关文章:

  • WPS不登录无法使用基本功能的解决方案
  • “深入浅出”系列之数通篇:(5)TCP的三次握手和四次挥手
  • openharmony应用开发快速入门
  • 国家统计局湖北调查总队副总队长张小青一行调研珈和科技农业遥感调查智能化算法
  • 【C++】如何从源代码编译红色警戒2地图编辑器
  • 微信小程序-base64加解密
  • 按类别调整目标检测标注框的写入顺序以优化人工审核效率
  • VMProtect:软件保护与安全的全面解决方案
  • LabVIEW农机自主导航监控系统
  • 【Redis篇】Set和Zset 有序集合基本使用
  • 【系统】Mac crontab 无法退出编辑模式问题
  • 企业内训|阅读行业产品运营实战训练营-某运营商数字娱乐公司
  • 游戏AI实现-寻路算法(GBFS)
  • ubuntu系统版本安装docker容器
  • Electron和C/C++开发桌面应用对比
  • 数据结构实验题目剖析·下篇(PTA平台原题)
  • springboot443旅游管理系统(论文+源码)_kaic
  • 点焊机器人维修-ABB-KUKA-FANUC-YASKAWA
  • 第四篇:HTTP 的铠甲——HTTPS 的故事
  • 家中常用的路由器密码如何更改详细教程
  • flask flask-socketio创建一个网页聊天应用
  • 编辑器kindeditor
  • 优化Lua-cURL:减少网络请求延迟的实用方法
  • git从入门到实践
  • DAOBase 推出 DAO POP:赋能创作者与社区,畅享链上未来
  • linux中docker命令大全