深入分析Java中的重载与重写:理解多态的两个面向

深入分析Java中的重载与重写:理解多态的两个面向

之前其实写过一篇文章来探讨Java当中的方法重载与方法重写但当时学的还不够通透,分析有点片面,这次我从多态的角度对其进行分析,有问题欢迎大家来评论区一起探讨

在Java编程中,重载(Overloading)和重写(Overriding)是两种重要的面向对象特性,它们与多态密切相关。虽然这两者看似相似,但它们的实现方式、使用场景和多态类型完全不同。

1. 什么是重载与重写?

1.1 重载(Overloading)

重载是指在同一个类中可以定义多个方法,这些方法的名字相同但参数不同(包括参数类型、数量和顺序)。重载是在编译时决定的,也被称为静态多态

1.2 重写(Overriding)

重写是指在子类中可以重写父类的方法,目的是提供子类特定的实现。重写是在运行时决定的,也被称为动态多态

2. 重载与重写的关键区别

2.1 语法与实现

  • 重载

    • 在同一个类中定义多个同名方法。
    • 方法签名必须不同,参数类型、数量或顺序不同。

    示例

    class MathUtils {
        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, double b) {
            return a + b; // 重载方法:传入两个双精度浮点数
        }
    }
    
  • 重写

    • 在子类中定义与父类相同签名的方法。
    • 使用 @Override注解提高代码可读性和可维护性。

    示例

    class Animal {
        public void sound() {
            System.out.println("Some generic animal sound");
        }
    }
    
    class Dog extends Animal {
        @Override
        public void sound() {
            System.out.println("Bark");
        }
    }
    
    class Cat extends Animal {
        @Override
        public void sound() {
            System.out.println("Meow");
        }
    }
    

2.2 多态类型

  • 重载:属于编译时多态,在编译阶段,根据传入参数决定调用哪个重载方法。
  • 重写:属于运行时多态,在运行时根据对象的实际类型确定调用哪个方法。

2.3 目的

  • 重载:提高代码的可读性,方便对同一功能的不同实现进行区分。
  • 重写:实现父类和子类之间的行为多样性,允许子类根据自身特性来改变父类的方法实现。

3. 重载为什么是编译时多态?

重载被称为编译时多态的原因在于:

  • 编译器决策:在编译阶段,编译器根据方法调用的参数类型、数量和顺序决定具体的重载方法。

  • 示例分析

    public class Main {
        public static void main(String[] args) {
            MathUtils mathUtils = new MathUtils();
            System.out.println(mathUtils.add(5, 10));              // 调用 add(int, int)
            System.out.println(mathUtils.add(5, 10, 15));          // 调用 add(int, int, int)
            System.out.println(mathUtils.add(5.0, 10.0));          // 调用 add(double, double)
        }
    }
    

4. 重写为什么是运行时多态?

重写被称为运行时多态的原因在于:

  • 动态决策:在运行时,通过对象的实际类型确定方法调用。

  • 示例分析

    public class Zoo {
        public static void main(String[] args) {
            Animal myDog = new Dog();
            Animal myCat = new Cat();
    
            myDog.sound();  // 输出:Bark
            myCat.sound();  // 输出:Meow
    
            // 使用Animal数组来展示多态
            Animal[] animals = { new Dog(), new Cat() };
            for (Animal animal : animals) {
                animal.sound(); // 动态调用实际类型的方法
            }
        }
    }
    

5. 实际应用场景

5.1 重载的应用

重载常用于参数不同的情况下,例如数学运算或格式化输出。

示例代码:计算区域
class ShapeUtils {
    public double area(double side) {
        return side * side; // 正方形
    }

    public double area(double length, double width) {
        return length * width; // 矩形
    }

    public double area(double radius, boolean isCircle) {
        if (isCircle) {
            return Math.PI * radius * radius; // 圆形
        }
        return 0;
    }
}

public class Main {
    public static void main(String[] args) {
        ShapeUtils shapeUtils = new ShapeUtils();
    
        System.out.println("Square Area: " + shapeUtils.area(5));              // 正方形
        System.out.println("Rectangle Area: " + shapeUtils.area(5, 10));      // 矩形
        System.out.println("Circle Area: " + shapeUtils.area(7, true));        // 圆形
    }
}

5.2 重写的应用

重写常用于需要实现多态性的场景,例如在动物园管理系统中。

示例代码:动物叫声
class Animal {
    public void sound() {
        System.out.println("Some generic animal sound");
    }
}

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

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

public class Zoo {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        Animal myCat = new Cat();
    
        myDog.sound();  // 输出:Bark
        myCat.sound();  // 输出:Meow

        Animal[] animals = { new Dog(), new Cat() };
        for (Animal animal : animals) {
            animal.sound(); // 动态调用实际类型的方法
        }
    }
}

6. 重载与重写的对比表

特性重载(Overloading)重写(Overriding)
定义在同一类中定义同名但参数不同的方法在子类中重写父类的方法
多态类型编译时多态运行时多态
方法签名必须不同(参数类型、数量或顺序)签名必须完全相同
适用场景当需要同一个方法名的不同实现时当子类需要特定实现时
使用注解无需使用通常使用 @Override注解

通过上述对比表,您可以更清晰地了解重载与重写之间的不同之处。希望这能帮助您在Java开发中做出更明智的决策,理解这两种特性将使您能够编写更灵活、更具可维护性的代码。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

b站视频(网页加客户端)+本地视频 生成回链

b站视频(网页加客户端)本地视频 生成回链 引言 基于上一篇博客方案 本地视频进度加入笔记根据进度快速锁定视频位置 我想着只有本地的话, 那b站上的视频, 不是每次都得下载下来吗? 如果是一套课程, 直接下载, 然后视频处理成mp3,还好, 如果只是一个视频, 每次这样处理就有点…

mac 安装 node

brew versions node // 安装 node brew versions node14 // 安装指定版本 卸载node: sudo npm uninstall npm -g sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules /var/db/receipts/org.nodejs.* sudo rm -rf /usr/local/include/node /Users/$USER/.npm su…

电子应用设计方案94:智能AI门禁系统设计

智能 AI 门禁系统设计 一、引言 智能 AI 门禁系统旨在提供更高效、安全和便捷的门禁控制解决方案,结合人工智能技术实现精准的身份识别和智能化的访问管理。 二、系统概述 1. 系统目标 - 实现高精度的人脸识别、指纹识别、虹膜识别等多模态生物识别技术。 - 具备智…

机器学习经典无监督算法——聚类K-Means算法

目录 算法原理 算法步骤 算法API 算法导入 API参数理解 算法实现 算法原理 Kmeans 算法是一种无监督的聚类算法,目的是将数据集中的样本划分到 K 个不同的簇中。 聚类:将数据集中相似的数据点归为一组或一个簇的过程。 数据集:一组相…

Android系统定制APP开发_如何对应用进行系统签名

前言 当项目开发需要使用系统级别权限或frame层某些api时,普通应用是无法使用的,需要在AndroidManifest中配置sharedUserId: AndroidManifest.xml中的android:sharedUserId“android.uid.system”,代表的意思是和系统相同的uid&a…

【机器学习实战入门】使用OpenCV和Keras的驾驶员疲劳检测系统

嗜睡驾驶者警报系统 防止司机疲劳驾驶警报系统 中级 Python 项目 - 司机疲劳检测系统 疲劳检测是一种安全技术,能够预防因司机在驾驶过程中入睡而造成的事故。 本中级 Python 项目的目标是建立一个疲劳检测系统,该系统将检测到一个人的眼睛闭合了一段时…

5 分钟复刻你的声音,一键实现 GPT-Sovits 模型部署

想象一下,只需简单几步操作,就能生成逼真的语音效果,无论是为客户服务还是为游戏角色配音,都能轻松实现。GPT-Sovits 模型,其高效的语音生成能力为实现自然、流畅的语音交互提供了强有力的技术支持。本文将详细介绍如何…

自动化办公|xlwings简介

xlwings 是一个开源的 Python 库,旨在实现 Python 与 Microsoft Excel 的无缝集成。它允许用户使用 Python 脚本自动化 Excel 操作,读取和写入数据,执行宏,甚至调用 VBA 脚本。这使得数据分析、报告生成和其他与 Excel 相关的任务…

JTAG调试器的使用方法

概述: JTAG(联合测试行动组)是基于IEEE 1149.1标准的专用硬件接口。该接口旨在将复杂的芯片和设备连接到标准测试和调试硬件。目前JTAG主要用于: Output control of microcircuits; Testing of printed circuit boards; Flashing of microchips with memory; Chip softwa…

第三次作业:源码编译安装httpd 2.4,提供系统服务管理脚本并测试(两种方法实现)

准备工作 下载httpd软件包进行源码安装 [rootrocky ~]# wget https://archive.apache.org/dist/httpd/httpd-2.4.46.tar.gz 由于进行源码安装,需要对安装对应的编译工具 [rootopen2 ~]# yum install gcc gcc-c make -y 解压文件到指定的目录/usr/local/src下 [root…

Web自动化之验证码识别彻底解决方案

验证码识别解决方案 对于web应用程序来讲,处于安全性考虑,在登录的时候,都会设置验证码,验证码的类型种类繁多,有图片中辨别数字字母的,有点击图片中指定的文字的,也有算术计算结果的&#xff…

第34天:Web开发-PHP应用鉴别修复AI算法流量检测PHP.INI通用过滤内置函数

#知识点 1、安全开发-原生PHP-PHP.INI安全 2、安全开发-原生PHP-全局文件&单函数 3、安全开发-原生PHP-流量检测&AI算法 一、通用-PHP.INI设置 参考: https://www.yisu.com/ask/28100386.html https://blog.csdn.net/u014265398/article/details/109700309 …

C++多态的认识与理解

多态的定义 多态其实就是同一操作在不同的对象上可以有不同的实现方式。 多态的类型 多态分为静态多态和动态多态两种,而静态多态其实我们之前就了解过,今天主要是讲解一下动态多态。 静态多态(编译时多态):静态多态其实就是在…

Ubuntu安装搜狗输入法

Ubuntu安装搜狗输入法 官网完整安装步骤调整默认输入法 官网 搜狗输入法 - 官网:https://shurufa.sogou.com/ 搜狗输入法Linux版 - 首页:https://shurufa.sogou.com/linux 搜狗输入法Linux版 - 安装指南:https://shurufa.sogou.com/linux/gu…

ElasticSearch下

DSL查询 叶子查询:在特定字段里查询特定值,属于简单查询,很少单独使用复合查询:以逻辑方式组合多个叶子查询或更改叶子查询的行为方式 在查询后还可以对查询结果做处理: 排序:按照1个或多个字段做排序分页…

【个人开发】nginx域名映射及ssl证书配置踩坑记录

1. 背景 买了个域名,申请了ssl证书,买都买了,不得部署点东西。于是开始一堆踩坑之旅。 2. 踩过的坑 2.1 报错1:域名访问 Invalid Host header 项目是一个简单的vue项目,启动方式如下 npm run serve但浏览器出现报错&#xff…

Go-Zero整合Goose实现MySQL数据库版本管理

推荐阅读 【系列好文】go-zero从入门到精通(看了就会) 教程地址:https://blog.csdn.net/u011019141/article/details/139619172 Go-Zero整合Goose实现MySQL数据库版本管理的教程 在开发中,数据库迁移和版本管理是必不可少的工作。…

每日一题洛谷P1427 小鱼的数字游戏c++

#include<iostream> using namespace std; int main() {long long s[100] { 0 };int i 0;while (1) {cin >> s[i];if (s[i]0) {break;}i;}for (i; i > 0;i--) {if(s[i]!0)cout << s[i] << " ";}return 0; }

力扣 子集

回溯基础&#xff0c;一题多解&#xff0c;不同的回朔过程。 题目 求子集中&#xff0c;数组的每种元素有选与不选两种状态。因此在使用dfs与回溯时把每一个元素分别进行选与不选的情况考虑即可。可以先用dfs跳过当前元素即不选然后一直深层挖下去&#xff0c;直到挖到最深了即…

宇泰串口卡驱动在Ubuntu22.04编译、安装汇总

从官网下载驱动官网地址 上传到Ubuntu, 目录结构如下&#xff1a; 驱动源代码: 驱动代码是基于开源项目编译来的 编译路径不能有中文路径&#xff0c;否则可能有类似错误 源码是基于Linux2.3内核编译&#xff0c;我当前是6.8.0-51&#xff0c;数据结构有升级&#xff0c;需要调…