【Java】:方法重写、动态绑定和多态

目录

一个生动形象的例子

场景设定

1. 方法重写(Method Overriding)

2. 动态绑定(Dynamic Binding)

3. 多态(Polymorphism)

归纳关系:

重写

概念

条件

重写的示例

重载与重写的区别

动态绑定

定义:

多态性的实现:

与静态绑定的区别:

示例:

多态

定义

实现方式

实现原理

应用场景

示例

意义


一个生动形象的例子

场景设定

想象一个汽车制造厂,其中有不同类型的车辆,如轿车、SUV和卡车。每种车辆都有自己独特的驾驶行为,但它们都继承自一个基本的“汽车”类。

1. 方法重写(Method Overriding)
  • 定义:子类提供与父类相同方法名、参数列表和返回值类型的方法,以覆盖父类中的方法。

在这个例子中,假设“汽车”类有一个名为“drive”的方法,它输出“汽车正在行驶”。但是,轿车、SUV和卡车在行驶时可能有不同的表现,因此它们各自重写了“drive”方法。

  • 轿车类重写“drive”方法:输出“轿车平稳行驶”。
  • SUV类重写“drive”方法:输出“SUV越野行驶”。
  • 卡车类重写“drive”方法:输出“卡车重载行驶”。
2. 动态绑定(Dynamic Binding)
  • 定义:在运行时根据对象的实际类型来确定调用哪个重写后的方法。

现在,假设制造厂有一个测试驾驶员,他只需要知道如何“驾驶”(即调用“drive”方法),而不需要知道具体是哪种车型。当他驾驶不同类型的汽车时,会动态地绑定到相应车型重写的“drive”方法上。

3. 多态(Polymorphism)
  • 定义:允许一个接口(或父类引用)引用多种实际类型,并根据实际类型执行对应的方法。

在测试中,驾驶员可以驾驶不同类型的汽车,而每种车型在行驶时展现出不同的行为,这就是多态的体现。虽然驾驶员都是通过调用“drive”方法来驾驶汽车,但具体的行驶表现却因车型的不同而不同。

归纳关系:
  • 方法重写是实现多态的基础,子类通过重写父类的方法以提供自己独特的行为。
  • 动态绑定则使得在运行时能够根据实际对象的类型来调用相应重写后的方法,从而实现多态的效果。
  • 多态则是这些技术综合应用的结果,它允许我们使用统一的接口(如本例中的“drive”方法)来处理不同类型的对象,并在运行时展现出各自独特的行为。

重写

概念

方法重写,是面向对象编程中的一个重要概念,特别是在Java这样的面向对象的编程语言中。方法重写允许子类提供一个与父类中已有方法具有相同方法签名(即方法名和参数列表相同)的实现。

通过方法的重写,子类可以改变或扩展从父类继承的方法的行为。


条件

在Java中,要进行方法重写,必须满足以下条件:

  • 方法名和参数列表必须与父类中被重写的方法相同:

这是为了确保在运行时能够正确地识别和调用重写的方法。

  • 访问修饰符不能低于父类方法的访问修饰符:

例如,如果父类方法时 public 的,那么重写该方法的方法也必须时 public 的。

  • 返回类型必须与父类中被重写的方法的返回类型相同
  • 子类方法抛出的异常类型必须是父类方法所抛出异常类型的子集:

子类方法可以不抛出异常,或者抛出与父类方法相同的异常或其子类型的异常。

  • 被重写的方法不能是 final 或 static 方法:

final 方法不能被重写,而 static 方法与类关联而非实例关联,因此也不适用于重写​​​​​​​

重写的示例

下面是一个简单的Java示例,展示了如何重写父类的方法:

class Animal {  public void makeSound() {  System.out.println("Some generic animal sound");  }  
}  class Dog extends Animal {  @Override // 注解表明此方法是重写父类方法  public void makeSound() {  System.out.println("Bark");  }  
}  public class MethodOverridingExample {  public static void main(String[] args) {  Animal animal = new Dog(); // Animal类型的引用指向Dog类型的对象  animal.makeSound(); // 输出"Bark",因为Dog类重写了makeSound方法  }  
}

在这个例子中,Dog 类继承了 Animal 类,并重写了 makeSound 方法。当我们通过 Animal 类型的引用调用 makeSound 方法时,实际上调用的是 Dog 类中重写后的 makeSound 方法,输出“Bark”。


重载与重写的区别

  • 重写发生在父类和子类之间,子类提供与父类相同方法签名的新实现。
  • 重载发生在同一个类中,允许多个方法拥有相同的名字,但参数列表不同(参数数量、类型或顺序不同)。

动态绑定

在Java中,动态绑定(Dynamic Binding)是一个核心概念,它允许在运行时根据对象的实际类型来确定调用哪个方法。这种机制是实现多态性的关键,使得程序能够在运行时灵活地处理不同类型的对象。

定义

动态绑定是指在程序运行过程中,根据具体的实例对象来确定调用哪个方法的过程。它不同于静态绑定(前期绑定),后者在编译时就已经确定了方法的调用关系。

多态性的实现

  • 动态绑定是实现多态性的重要因素。多态性允许我们使用父类类型的引用来引用子类的对象,并在运行时确定实际调用的方法。这种机制增加了程序的灵活性和可扩展性。
  • 例如,假设有一个父类 Animal 和一个子类 Dog ,Dog 类重写了 Animal 类的 makeSound() 方法。当我们创建一个 Dog 对象并将其赋值给一个 Animal 类型的引用时,通过该引用调用 makeSound() 方法,会动态地绑定到 Dog 类的实现上。

与静态绑定的区别

  • 静态绑定(也称为前期绑定或编译时绑定)是在编译时就已经确定了方法的调用关系。它通常用于调用静态方法、私有方法、构造方法以及使用 final 修饰的方法等。
  • 动态绑定则是在运行时根据对象的实际类型来确定方法的调用关系。它主要用于实现多态性,使得程序能够更加灵活和可扩展。

示例

class Animal {  void makeSound() {  System.out.println("Animal sound");  }  
}  class Dog extends Animal {  @Override  void makeSound() {  System.out.println("Bark");  }  
}  public class DynamicBindingExample {  public static void main(String[] args) {  Animal animal = new Dog(); // 向上转型  animal.makeSound(); // 动态绑定到Dog类的makeSound()方法上  }  
}

在上述示例中,当我们通过父类类型的引用 animal 调用 makeSound() 方法时,会动态地绑定到 Dog 类的实现上,输出“Bark”。这就是动态绑定的一个典型应用示例。

注意事项

  • 动态绑定只适用于实例方法,不适用于静态方法、私有方法和构造方法。这是因为这些方法在编译时就已经确定了调用关系,无法进行动态绑定。
  • 使用 final 修饰的方法也无法进行动态绑定,因为它们不能被重写。

多态

在Java编程语言中,多态性是面向对象编程的三大特性之一,它允许一个接口(或基类引用)被多种数据类型所实现,并根据实际的类型执行对应的方法。以下是关于Java中多态的详细介绍:

定义

多态(Polymorphism)是指允许一个接口(或父类引用)引用多种实际类型,并且可以根据实际的类型来执行对应的方法。简言之,就是同一个方法调用可以有不同的实现方式。

实现方式

Java中多态的实现主要依赖于继承和方法重写。

  • 继承:子类可以继承父类的方法定义和属性,从而具备相同的方法签名。
  • 方法重写(覆盖):子类可以对继承自父类的方法进行重写,即在子类中重新定义与父类相同签名的方法。

实现原理

多态的实现原理主要基于动态绑定(Dynamic Binding),也称为后期绑定。在运行时,Java虚拟机会根据对象的实际类型来确定调用哪个重写后的方法。这种机制使得相同的消息(即方法调用)可以根据不同的对象而具有不同的行为。

应用场景

多态在Java编程中有广泛的应用,以下是几个常见的应用场景:

  • 接口和抽象类的使用:通过定义接口或抽象类,并在父类中声明一组方法,具体实现留给子类。这样,不同的子类可以实现各自独特的行为。
  • 方法重写和回调机制:在父类中定义一个回调方法,子类重写该方法,并由父类对象调用。这样,根据不同的子类实现,可以执行相应的逻辑。

示例

假设有一个 Animal 类和两个子类 Dog 和 Cat,每个类都有一个 makeSound 方法。通过多态,我们可以使用一个 Animal 类型的引用来引用 Dog 或 Cat 对象,并调用它们的 makeSound 方法。在运行时,Java虚拟机会根据对象的实际类型(Dog 或 Cat)来确定调用哪个实现。

Animal animal1 = new Dog();  
Animal animal2 = new Cat();  animal1.makeSound(); // 输出 "Woof!"  
animal2.makeSound(); // 输出 "Meow!"

意义

多态性提高了代码的灵活性和可扩展性。通过多态,我们可以编写更加通用的代码,而无需关心具体的实现细节。这使得代码更加易于维护和扩展。

注意事项

  • 多态只适用于实例方法,不适用于静态方法。因为静态方法与类关联,而不是与实例关联。
  • 多态的实现需要满足两个条件:一是方法必须在子类中被重写;二是必须通过父类引用

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

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

相关文章

libssh C++封装之七(File)

1 概述 libssh是一个在客户端和服务器端实现SSHv2协议的多平台C库。使用libssh,您可以远程执行程序、传输文件、使用安全透明的隧道、管理公钥等等。本文描述的对libssh客户端功能的C++封装。 libssh下载地址 3 实现 3.6 File File类型可以读写远程文件。 3.6.1 File定义 …

使用rsync+lnotify实现远程数据实时同步备份

目录 1、定时备份与实时备份区别 2、配置客户端 2.1、在客户端安装inotify-tools软件。以便提供inotifywait inotifywatch 辅助工具程序 2.2 验证:监控客户端/data_backup目录的变化 2.3 编写自动同步脚本 2.4 后台运行脚本 2.5 验证数据实时同步效果 1、定…

SpringCloud:服务拆分和远程调用

程序员老茶 🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 P   S : 点赞是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全栈&#…

使用socat做端口转发

最近买的云上mongo数据库但是数据库不支持外网访问,准备做iptables转发但是一直不成功,腾讯云官方给予的解释是受服务器内启动的docker影响 做iptables转发会冲突,所以只能另想办法,我发现使用socat做转发也很好用,所以…

FPGA相关论文阅读

一、Achieving 100Gbps Intrusion Prevention on a Single Server 论文名称中文翻译:在单台服务器上实现100Gbps吞吐量的入侵防御检测。 文章中的Mixed-1和Norm-1 二、Distributed Password Hash Computation on Commodity Heterogeneous Programmable Platforms…

【回溯 字典树(前缀树)】212. 单词搜索 II

本文涉及知识点 回溯 字典树(前缀树) LeetCode212. 单词搜索 II 给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。 单词必须按照字母顺序,通过 相邻的单元…

第3周 后端微服务基础架构与前端项目联调配备

第3周 后端微服务基础架构与前端项目联调配备 1. 微服务项目层次设计与Maven聚合1.1 项目层次设计1.2 父项目pom1.2.1 打包方式 1.3 创建通用 ************************************************************************************** 1. 微服务项目层次设计与Maven聚合 1.1…

Tower for Mac:Git管理的新境界

Tower for Mac,让您的Git管理进入新境界!这款专为Mac用户打造的Git客户端,凭借其出色的性能和丰富的功能,成为众多开发者的首选工具。 Tower不仅支持常规的Git操作,如提交、推送和拉取,还提供了许多高级功能…

四、VGA项目:联合精简帧+双fifo+sobel算法 实现VGA显示

前言:该项目实际上是在很多基础的小练习上合成起来的,例如涉及到uart(rs232)的数据传输、双fifo流水线操作、VGA图像显示,本次内容在此基础上又增添了sobel算法,能实现图像的边沿监测并VGA显示。 文章目录…

简单的DbUtils工具类【精细】

目录 单条通用增删改方法 1.创建maven项目,并加载依赖 2.创建数据库连接工具类(Dbutils类) 3.创建一个执行器(SqlExecutor类) 4.通用(增,删,改)方法 1.创建方法 2.创建userInfo实体类 3.创建测试类,测试增,删&#xf…

探索数据结构:树与二叉树

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 树 1.1. 树的定义 树是一种非线性的数据结构,它是由n&a…

ORA-609频繁出现在alert.log,如何解决?

ORA-609就alertlog中比较常见的一个报错,虽然并没有太大的影响,但是频繁的出现在alert log也是很让人厌烦的事情,本文介绍如何排查解决ORA-609问题。 1.ORA-609官方定义 could not attach to incoming connection Cause Oracle process cou…

【SRC实战】前端脱敏信息泄露

挖个洞先 https://mp.weixin.qq.com/s/xnCQQCAneT21vYH8Q3OCpw “ 以下漏洞均为实验靶场,如有雷同,纯属巧合 ” 01 — 漏洞证明 一、前端脱敏,请求包泄露明文 “ 前端脱敏处理,请求包是否存在泄露? ” 1、获取验…

|Python新手小白中级教程|第二十八章:面向对象编程(类定义语法私有属性类的继承与多态)(4)

文章目录 前言一、类定义语法二、私有方法和私有属性1.私有属性2.私有方法 三、类“继承”1.初识继承2.使用super函数调用父类中构造的东西 四、类“多态”1.多态基础2.子类不同形态3.使用isinstance函数与多态结合判断类型 总结 前言 大家好,我是BoBo仔吖&#xf…

6818Linux内核开发移植

Linux内核开发移植 Linux内核版本变迁及其获得 Linux是最受欢迎的自由电脑操作系统内核, 是一个用C语言写成, 并且符合POSIX标准的类Unix操作系统 Linux是由芬兰黑客Linus Torvalds开发的, 目的是尝试在英特尔x86架构上提供自由免费的类Un…

Task Office for Mac v9.0激活版:任务管理新境界

还在为繁琐的任务管理而烦恼吗?Task Office for Mac为您带来全新的任务管理体验。简洁明了的界面设计,让您轻松上手;强大的任务管理和项目管理功能,让您轻松掌握任务进度;多用户协作功能,让团队协作更加高效…

Excel办公技巧之下拉菜单

在日常办工中,经常需在单元格中输入特定的值,此时我们可以使用下拉菜单解决,输入错误和错误值,可以一劳永逸的解决固定数据输入问题。 使用Excel下拉菜单时,它在数据输入和验证方面发挥着重要作用通过点击单元格的下拉…

商业数据分析--时间序列图及趋势分析

绘制时间序列图,并指出存在什么样的状态如上两图: 可见状态:从时间序列图可以看出,这些数据存在明显的季节性波动,每年的第4季度值都最高,而第2季度值最低。同时也存在一些下降的趋势。 通过引进虚拟变量,建立多元线性回归模型。答: 通过引入虚拟变量,我们可以建立如下的…

商场学习之微服务

前言 寒假前在新电脑上配置了java环境,maven仓库,node,js,navicat,MySQL,linux,vmware等环境,创建了6个mysql数据库,77张表。 如此多的表,字段,去手写基础…

Web入门——三栏布局页面

前置知识 内外边距 内边距(padding): padding是元素边框与其内容之间的空间。也就是说,如果你给一个元素设置了内边距,这个空间会作为元素内容与元素边框之间的缓冲区域。设置内边距会使元素本身变大。例如padding:10px就创建了10像素的空间…