Java面试要点18 - Java运行时多态与编译时多态

news2024/11/14 11:24:32

在这里插入图片描述

本文目录

    • 一、引言
    • 二、运行时多态的实现
    • 三、编译时多态的实现
    • 四、多态与接口
    • 五、多态的实际应用
    • 六、总结


一、引言

多态是面向对象编程的三大特性之一,它允许我们以统一的方式处理不同类型的对象。Java中的多态分为两种:编译时多态(重载)和运行时多态(重写)。通过多态,我们可以编写出更加灵活和可扩展的代码。

二、运行时多态的实现

运行时多态是通过方法重写和动态绑定来实现的。当父类引用指向子类对象时,调用被重写的方法将执行子类的版本。这种动态绑定机制是在运行时才确定具体调用哪个方法的。

通过一个实际的例子来理解:

public class Animal {
    protected String name;
    
    public Animal(String name) {
        this.name = name;
    }
    
    public void makeSound() {
        System.out.println("动物发出声音");
    }
    
    public void move() {
        System.out.println(name + "正在移动");
    }
}

public class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
    
    @Override
    public void makeSound() {
        System.out.println(name + "汪汪叫");
    }
    
    @Override
    public void move() {
        System.out.println(name + "正在奔跑");
    }
}

public class Bird extends Animal {
    public Bird(String name) {
        super(name);
    }
    
    @Override
    public void makeSound() {
        System.out.println(name + "叽叽喳喳叫");
    }
    
    @Override
    public void move() {
        System.out.println(name + "正在飞行");
    }
}

public class PolymorphismDemo {
    public static void main(String[] args) {
        Animal dog = new Dog("小黑");
        Animal bird = new Bird("小鸟");
        
        // 运行时多态
        dog.makeSound();  // 输出:小黑汪汪叫
        bird.makeSound(); // 输出:小鸟叽叽喳喳叫
        
        dog.move();      // 输出:小黑正在奔跑
        bird.move();     // 输出:小鸟正在飞行
    }
}

三、编译时多态的实现

编译时多态通过方法重载来实现,即在同一个类中定义多个名称相同但参数列表不同的方法。编译器会根据方法调用时提供的参数类型和数量来决定调用哪个方法。

public class Calculator {
    // 方法重载示例
    public int add(int a, int b) {
        System.out.println("调用两个整数的加法");
        return a + b;
    }
    
    public double add(double a, double b) {
        System.out.println("调用两个浮点数的加法");
        return a + b;
    }
    
    public String add(String a, String b) {
        System.out.println("调用两个字符串的连接");
        return a + b;
    }
    
    public int add(int... numbers) {
        System.out.println("调用可变参数的加法");
        int sum = 0;
        for (int num : numbers) {
            sum += num;
        }
        return sum;
    }
    
    public static void main(String[] args) {
        Calculator calc = new Calculator();
        
        // 编译时多态
        System.out.println(calc.add(5, 3));           // 调用int版本
        System.out.println(calc.add(3.14, 2.86));     // 调用double版本
        System.out.println(calc.add("Hello ", "World")); // 调用String版本
        System.out.println(calc.add(1, 2, 3, 4, 5));  // 调用可变参数版本
    }
}

四、多态与接口

接口是实现多态的另一个重要机制。通过接口,可以定义一组行为规范,让不同的类去实现这些行为。这样可以实现更灵活的代码结构。

public interface Payable {
    double calculatePay();
    void processPayment();
}

public class Employee implements Payable {
    private String name;
    private double salary;
    
    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }
    
    @Override
    public double calculatePay() {
        return salary;
    }
    
    @Override
    public void processPayment() {
        System.out.println("处理" + name + "的工资支付:" + salary);
    }
}

public class Contractor implements Payable {
    private String name;
    private double hourlyRate;
    private int hoursWorked;
    
    public Contractor(String name, double hourlyRate, int hoursWorked) {
        this.name = name;
        this.hourlyRate = hourlyRate;
        this.hoursWorked = hoursWorked;
    }
    
    @Override
    public double calculatePay() {
        return hourlyRate * hoursWorked;
    }
    
    @Override
    public void processPayment() {
        System.out.println("处理承包商" + name + "的工资支付:" + calculatePay());
    }
}

五、多态的实际应用

多态在实际开发中有着广泛的应用。通过多态,可以编写出更加通用和可扩展的代码。

下面是一个实际应用的示例:

public class PayrollSystem {
    private List<Payable> payees = new ArrayList<>();
    
    public void addPayee(Payable payee) {
        payees.add(payee);
    }
    
    public void processPayroll() {
        for (Payable payee : payees) {
            payee.processPayment();
        }
    }
    
    public double calculateTotalPayout() {
        double total = 0;
        for (Payable payee : payees) {
            total += payee.calculatePay();
        }
        return total;
    }
    
    public static void main(String[] args) {
        PayrollSystem payrollSystem = new PayrollSystem();
        
        payrollSystem.addPayee(new Employee("张三", 5000));
        payrollSystem.addPayee(new Employee("李四", 6000));
        payrollSystem.addPayee(new Contractor("王五", 200, 20));
        
        // 处理所有支付
        payrollSystem.processPayroll();
        
        // 计算总支付金额
        System.out.println("总支付金额:" + payrollSystem.calculateTotalPayout());
    }
}

六、总结

Java中的多态是一个强大的特性,它通过方法重写(运行时多态)和方法重载(编译时多态)两种机制来实现。运行时多态可以通过父类引用调用子类的方法,而编译时多态则能够使用同一个方法名处理不同类型的参数。通过接口和抽象类,可以实现更灵活的多态机制。在实际开发中,合理使用多态可以提高代码的可复用性和可扩展性,使系统更加灵活和易于维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2240145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件

前言 假设您正在现有项目中集成这些包&#xff0c;而该项目的构建工具为 Webpack 或 Vite。同时&#xff0c;您对 Three.js 和 React 有一定的了解。如果您发现有任何错误或有更好的方法&#xff0c;请随时留言。 安装 npm install three types/three react-three/fiber rea…

HBase理论_背景特点及数据单元及与Hive对比

本文结合了个人的笔记以及工作中实践经验以及参考HBase官网&#xff0c;我尽可能把自己的知识点呈现出来&#xff0c;如果有误&#xff0c;还请指正。 1. HBase背景 HBase作为面向列的数据库运行在HDFS之上&#xff0c;HDFS缺乏随机读写操作&#xff0c;HBase正是为此而出现。…

(Go基础)Go的运行流程步骤与包的概念

1. 快速入门 所有的go开发&#xff0c;都必须存在并包含在某一个包内 .go 是go语言程序的后缀名 1.1 编译 通过使用 go build 命令对该go文件进行编译&#xff0c;生成.exe文件 1.2 运行 运行刚刚生成出来的test.exe文件既可&#xff0c;不过并不不是双击&#xff0c;而是在…

蓝桥杯每日真题 - 第11天

题目&#xff1a;&#xff08;合并数列&#xff09; 题目描述&#xff08;14届 C&C B组D题&#xff09; 解题思路&#xff1a; 题意理解&#xff1a;给定两个数组&#xff0c;目标是通过若干次合并操作使两个数组相同。每次合并操作可以将数组中相邻的两个数相加&#xff…

手撸 chatgpt 大模型:简述 LLM 的架构,算法和训练流程

本节我们自顶向下看看大模型的相关概念&#xff0c;了解其基本架构以及从零手撸大模型的基本流程。自从 openai 释放了 chatgpt 后&#xff0c;人工智能就立马进入了大模型时代&#xff0c;我还记得在此之前 NLP 的处理主要依赖于深度学习的 LSTM&#xff0c;GRU 等模型架构。这…

FPGA实现PCIE3.0视频采集转千兆UDP网络输出,基于XDMA+RTL8211E架构,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案我这里已有的以太网方案本博客方案的PCIE2.0版本 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频QT上位机XDMA配置及使用XDMA中断模块FDMA图像缓存UDP视频组包发送UDP协议栈MAC数据缓冲FIFO组…

2024年第四届“网鼎杯”网络安全比赛---朱雀组Crypto- WriteUp

2024年第四届“网鼎杯”网络安全比赛---朱雀组Crypto-WriteUp Crypto&#xff1a;Crypto-2&#xff1a;Crypto-3&#xff1a; 前言&#xff1a;本次比赛已经结束&#xff0c;用于赛后复现&#xff0c;欢迎大家交流学习&#xff01; Crypto&#xff1a; Crypto-2&#xff1a; …

PostgreSQL数据库笔记

PostgreSQL 是什么 PostgreSQL&#xff08;简称Postgres或PG&#xff09;是一个功能强大、可靠性高、可扩展性好的开源对象-关系数据库服务器&#xff08;ORDBMS&#xff09;&#xff0c;它以加州大学伯克利分校计算机系开发的POSTGRES版本4.2为基础。 发展历程 起源与发展&a…

el-table合并单元格之后,再进行隔行换色的且覆盖表格行鼠标移入的背景色的实现

el-table 中有现成的隔行换色功能&#xff0c;只要增加 stripe 属性即可。但是如果有单元格合并的话&#xff0c;这个属性就不可用了。这时候我们就需要动点小心思了。 基于相同字段进行合并 单元格合并&#xff1a;基于表头中的某一列&#xff0c;具有相同值的个数相加进行合…

光伏电站容量计算方法科普

光伏电站的容量计算是设计和评估光伏系统性能的关键步骤。通过了解光伏电站的容量&#xff0c;我们可以预估其发电量&#xff0c;优化系统设计&#xff0c;并确保系统能满足电力需求。本文将详细介绍几种常见的光伏电站容量计算方法&#xff0c;并特别介绍小程序“光伏一点通”…

mysql数据库(五)多表查询

多表查询 文章目录 多表查询一、链表查询1.1交叉连接1.2 内连接1.3 左连接1.4 右连接1.5 全连接1.6 例子 二、子查询2.1 in与not in2.2 any/some2.3 all2.4 比较运算符2.5 exists 三、例子 查询中使用的表如下所示 ------------ | id | name | ------------ | 1 | IT | …

06.VSCODE:备战大项目,CMake专项配置

娇小灵活的简捷配置不过是年轻人谈情说爱的玩具&#xff0c;帝国大厦的构建&#xff0c;终归要交给CMake去母仪天下。一个没有使用 CMake 的 C 项目&#xff0c;就像未来世界里的一台相声表演&#xff0c;有了德纲却无谦&#xff0c;观众笑着遗憾。—— 语出《双城记》作者&…

jmeter常用配置元件介绍总结之后置处理器

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之后置处理器 8.后置处理器8.1.CSS/JQuery提取器8.2.JSON JMESPath Extractor8.3.JSON提取器8.4.正则表达式提取器8.5.边界提取器8.5.Debug PostProcessor8.6.XPath2 Extractor8.7.XPath提取器8.8.结果状态处理器 8.后置处理…

淘宝/天猫按图搜索商品:taobao.item_search_img API的奇幻之旅

在这个看脸的时代&#xff0c;我们不仅对人要看颜值&#xff0c;连买东西都要“看脸”了。没错&#xff0c;我说的就是淘宝/天猫的按图搜索商品功能——taobao.item_search_img API。这个功能就像是电商平台的“人脸识别”&#xff0c;只不过它认的是商品的颜值。下面&#xff…

豆包MarsCode算法题:数组元素之和最小化

数组元素之和最小化 问题描述思路分析分析思路解决方案 参考代码&#xff08;Python&#xff09;代码分析1. solution 函数2. 计算 1 2 3 ... n 的和3. 乘以 k 得到最终的数组元素之和4. 主程序&#xff08;if __name__ __main__:&#xff09;代码的时间复杂度分析&#x…

已有账号,重装系统激活office后发现没有ppt,word,excel等

有时候重装系统后&#xff0c;登录windows结果右键没有word,excel等 点击进入office 进入右边的账户 找到设备和订阅 直接下载office 安装后就会出现了

【数据结构与算法】第12课—数据结构之归并排序

文章目录 1. 归并排序2. 计数排序3. 排序算法复杂度及稳定性分析在这里插入图片描述 1. 归并排序 分治法&#xff08;Divide and Conquer&#xff09;是一种重要的算法设计策略&#xff0c;其核心思想是将一个复杂的大问题分解为若干个小规模的子问题&#xff0c;递归地解决这些…

shell 100例

1、每天写一个文件 (题目要求&#xff09; 请按照这样的日期格式(xxxx-xx-xx每日生成一个文件 例如生成的文件为2017-12-20.log&#xff0c;并且把磁盘的使用情况写到到这个文件中不用考虑cron&#xff0c;仅仅写脚本即可 [核心要点] date命令用法 df命令 知识补充&#xff1…

微信公众平台申请(测试平台)

登录平台 微信公众平台 注册信息 回调路径不知道怎么填可以先不填&#xff0c;等写完项目就知道调用那个路径了 这样就注册好了

云原生-docker安装与基础操作

一、云原生 Docker 介绍 Docker 在云原生中的优势 二、docker的安装 三、docker的基础命令 1. docker pull&#xff08;拉取镜像&#xff09; 2. docker images&#xff08;查看本地镜像&#xff09; 3. docker run&#xff08;创建并启动容器&#xff09; 4. docker ps…