【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.hqwc.cn/news/692172.html

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

相关文章

2023.5.12 第43周周报

学习时间:2023.5.5-2023.5.12 学习内容: 1、answer question: img: 看到有论文说应该让图像和文本的潜在嵌入具有相似和合理的数值范围【-2,2】 调试发现模型的文本图像的潜在嵌入虽然符合,但相差较大。 在将文本和…

C++/Qt 小知识记录6

工作中遇到的一些小问题,总结的小知识记录:C/Qt 小知识6 dumpbin工具查看库导出符号OSGEarth使用编出的protobuf库,报错问题解决VS2022使用cpl模板后,提示会乱码的修改设置QProcess调用cmd.exe执行脚本QPainterPath对线段描边处理…

Linux基础命令(续)

17,wc命令 作用:统计行数、单词数、字符个数 格式: wc 选项 文件 wc passwd 26 36 1159 passwd26:行数 36:单词数 1159:字符数 passwd:文件名wc autofs.conf 426 2604 15137 autofs.conf426…

第⼀个SpringBoot程序

Spring Boot介绍 Spring让Java程序更加快速, 简单和安全. Spring对于速度、简单性和⽣产⼒的关注使其成为 世界上最流⾏的Java框架。 Spring Boot 的诞⽣是为了简化 Spring 项目而诞生的 创建Spring Boot项目 File->New Project->Spring Initializr 选择2.多的版本 创建…

【大数据】HDFS、HBase操作教程(含指令和JAVA API)

目录 1.前言 2.HDFS 2.1.指令操作 2.2.JAVA API 3.HBase 3.1.指令操作 3.2.JAVA API 1.前言 本文是作者大数据专栏系列的其中一篇,前文中已经详细聊过分布式文件系统HDFS和分布式数据库HBase了,本文将会是它们的实操讲解。 HDFS相关前文&#x…

spsr 的恢复出错,导致 thumb 指令集的 it 条件运行指令运行异常,清晰的调试思路帮助快速解决问题

记一次调试过程 这是一个在 arm 架构上的 RTOS 上的调试过程。问题现象为使用 thumb 指令集的 libgcc 库的情况下,浮点运算随机出错。经过一番追踪调试,逐步缩小问题范围,最后定位问题,成功解决。 场景 在某款的国产 RTOS 上&a…

DOM 文档对象模型

一、DOM简介 1、什么是DOM DOM 文档对象模型简称,是W3C组织推荐的处理可扩展标记语言的标准编程接口 W3C已经定义了一系列的DOM接口,通过这些接口可以改变网页的内容、结构、样式 2、DOM树 DOM把以上内容都看做是对象 二、获取元素 获取页面元素&am…

电子资源|基于SSM+vue的电子资源管理系统(源码+数据库+文档)​

电子资源管理系统 目录 基于SSMvue的电子资源管理系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 5.2.1管理员功能模块 5.2.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&am…

RPA正常跑,cmd输入cookies跑不出来,如何解决??

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

java基础之面向对象的思想

一、面向对象和面向过程的编程思想对比 面向过程:是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的(自己干活)。 面向对象:是一种以对象为中心的编程思想,通过指挥对象实现具体的…

【Java EE】网络原理——TCP1

目录 1.TCP协议格式 2.TCP协议的特点 3.TCP协议的核心机制(十个) 3.1确认应答机制 3.2超时重传 3.3连接管理 3.3.1三次握手基本流程: 3.3.2三次握手的意义或者解决的问题:(面试题) 3.3.3三次握手时…

并发——进程

1. 程序 程序(program)是什么? 计算机程序(computer program)一般是指以某些程序设计语言编程,能够运行于某种目标体系结构上 程序 数据结构 算法 数据结构:用来表示人们思维对象的抽…