【️如何理解Java中的多态】

在这里插入图片描述

✅如何理解Java中的多态?

    • ✅理解Java中的多态
  • ✅ 扩展知识仓
    • ✅方法的重载
    • ✅方法的重写
    • ✅重载和重写的区别区分

✅理解Java中的多态

多态的概念比较简单,就是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。


如果按照这个概念来定义的话,那么多态应该是一种运行期的状态。为了实现运行期多态,或者说是动态绑定,需要满足三个条件:
  • 有类继承或者接口实现
  • 子类要重写父类的方法
  • 父类的引用指向子类的对象

简单用代码来解释一下:
public class Parent {public void call() {sout("im Parent") ;}
}// 1.有类继承或者接口实现
public class Son extends Parent {// 2.子类要重写父类的方法public void call() {sout("im Son");}
}// 1.有类继承或者接口实现
public class Daughter extends Parent {// 2.子类要重写父类的方法public void call() {sout("im Daughter");}
}public class Test {public static void main(stringl] args) {Parent p = new Son(); //3.父类的引用指向子类的对象Parent p1 = new Daughter(); //3.父类的引用指向子类的对象}
}

这样,就实现了多态,同样是Parent类的实例,p.call 调用的是Son类的实现、p1.call调用的是Daughter的实现。


有人说,你自己定义的时候不就已经知道p是son,p1是Daughter了么。但是,有些时候你用到的对象并不都是自己声明的。
比如Spring 中的IOC出来的对象,你在使用的时候就不知道他是谁,或者说你可以不用关心他是谁。根据具体情况而定。
前面说多态是一种运行期的概念。还有一种说法,包括维基百科也说明,认为多态还分为动态多态和静态多态。
一般认为Jva中的函数重载是一种静态多态,因为他需要在编译期决定具体调用哪个方法。关于这一点,不同的人有不同的见解,建议在面试中如果被问到,可以这样回答:

     我认为,多态应该是一种运行期特性,Java中的重写是多态的体现。不过也有人提出重载是一种静态多态的想法,这个问题在StackOverflow等网站上有很多人讨论,但是并没有什么定论。我更加倾向于重载不是多态。


这样沟通,既能体现出你了解的多,又能表现出你有自己的思维,不是那种别人说什么就是什么的。

✅ 扩展知识仓

✅方法的重载

    方法的重载就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者重载方法。


public class HollisExample {// 方法重载 - 第一个方法public void display(int a) {System.out.println("Got Integer data.");}// 方法重载 - 第二个方法public void display(String b) {System.out.println("Got String data.");}
}

总之,方法的重载(Overloading)是指在同一个类中,可以有多个同名方法,只要它们的参数列表不同即可。方法的重载可以是参数个数的不同,也可以是参数类型的不同。

方法的重载使得程序可以根据不同的参数列表调用同名方法,增加了程序的灵活性和可读性。


再看一段代码:
public class Calculator {  // 加法方法,接受两个整数参数  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;  }  // 加法方法,接受三个浮点数参数  public double add(double a, double b, double c) {  return a + b + c;  }  public static void main(String[] args) {  Calculator calculator = new Calculator();  int sum1 = calculator.add(2, 3);      // 调用第一个add方法(两个整数)  int sum2 = calculator.add(4, 5, 6);  // 调用第二个add方法(三个整数)  double sum3 = calculator.add(2.5, 3.5);  // 调用第三个add方法(两个浮点数)  double sum4 = calculator.add(4.5, 5.5, 6.5);  // 调用第四个add方法(三个浮点数)  System.out.println("Sum1: " + sum1);  System.out.println("Sum2: " + sum2);  System.out.println("Sum3: " + sum3);  System.out.println("Sum4: " + sum4);  }  
}

在这个例子中,创建了一个名为 Calculator 的类,其中包含了四个名为 add 的方法。这四个方法分别接受不同类型和数量的参数,实现了方法的重载。在 main 方法中,我们根据传入的参数类型和数量调用相应的 add 方法,演示了方法的重载在实际编程中的应用。

✅方法的重写

    重写指的是在Java的子类与父类中有两个名称、参数列表都相同方法的情况。由于他们具有相同的方法签名,所以子类中的新方法将覆盖父类的原有方法。

public class Parent {// 父类的方法public void display() {System.out.println("Parent display()");}
}class Child extends Parent {// 子类重写了父类的方法@Overridepublic void display() {System.out.println("Child display()");}
}public class Main {public static void main(String[] args) {Parent objl = new Parent();obj1.display(); // 输出“Parent display()”Parent obj2 = new Child();obj2.display(); // 输出“Child display()”}
}

总之,方法的重写(Overriding)是面向对象编程中的一个重要概念,指的是在子类中重新定义父类中的方法,以覆盖(override)父类中的原有方法。重写方法的目的是为了在子类中提供特定的行为,而不必修改父类的代码。

方法的重写需要满足以下规则:

1.方法名、参数列表必须与父类中的方法完全****相同
2.返回类型可以是父类方法返回类型的子类型
3.子类方法的访问级别不能低于父类方法的访问级别

看一个代码实现方法的重写和多态的应用:

class Animal {  public void makeSound() {  System.out.println("The animal makes a sound");  }  
}  class Dog extends Animal {  @Override  public void makeSound() {  System.out.println("The dog barks");  }  public void bark() {  System.out.println("The dog barks");  }  
}  class Cat extends Animal {  @Override  public void makeSound() {  System.out.println("The cat meows");  }  public void meow() {  System.out.println("The cat meows");  }  
}  class Zoo {  public void playWithAnimal(Animal animal) {  animal.makeSound();  // 调用 Animal 类的方法  animal.bark();  // 调用 Dog 类的方法,因为 animal 实际上是 Dog 对象  animal.meow();  // 调用 Cat 类的方法,因为 animal 实际上是 Cat 对象  }  
}  public class Main {  public static void main(String[] args) {  Zoo zoo = new Zoo();  Animal animal1 = new Dog();  Animal animal2 = new Cat();  zoo.playWithAnimal(animal1);  // 输出 "The dog barks" 和 "The dog barks" 和 "The dog barks"  zoo.playWithAnimal(animal2);  // 输出 "The cat meows" 和 "The cat meows" 和 "The cat meows"  }  
}

在这个例子中,定义了一个 Animal 类,两个子类 Dog 和 Cat,以及一个 Zoo 类。Dog 类和 Cat 类分别重写了 makeSound 方法,并且添加了各自特有的方法 bark 和 meow。在 Zoo 类的 playWithAnimal 方法中,我们传入了一个 Animal 类型的参数。由于多态的存在,这个参数实际上可以是一个 Dog 对象或一个 Cat 对象。在方法内部,我们调用了 animal 的 makeSound 方法(实际上是调用子类的方法),以及子类特有的方法 bark 和 meow。因此,根据传入的参数类型,我们可以得到不同的输出结果。这个例子展示了方法的重写和多态的应用,使得程序更加灵活和可扩展。

✅重载和重写的区别区分

1、重载是一个编译期概念、重写是一个运行期概念。
2、重载遵循所谓 “编译期绑定” , 即在编译时根据参数变量的类型判定应该调用哪一个方法。
3、重写遵循所谓 “运行期绑定” , 即在运行的时候,根据引用变量所指向的实际对象的类型来调用方法。

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

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

相关文章

Java 中的内部类的定义

目录 一、成员内部类 二、静态内部类 三、局部内部类 四、匿名内部类 一、成员内部类 public class InnerClass {String name;private Integer age;static String hobby;/*** 成员内部类* 1、成员内部类中只能定义非静态属性和方法* 2、成员内部类中可以访问外部类的成员&a…

vue3表格导入导出.xlsx

在这次使用时恰好整出来了,希望大家也能学习到,特此分享出来 使用前确保安装以下模块,最好全局配置element-plus ### 展示一下 ### ###导出选项 ### ###导入de数据 ### 安装的模块 npm install js-table2excel // 安装js-table2excel n…

自动化测试工具选择指南

随着软件开发周期的不断缩短和需求的增加,自动化测试变得愈发重要。然而,选择适合项目的自动化测试工具并非易事。以下是一些指导原则,帮助你在众多自动化测试工具中做出明智的选择。 1. 项目需求分析 在选择自动化测试工具之前,首…

海康威视对讲广播系统 RCE漏洞复现(CVE-2023-6895)

0x01 产品简介 Hikvision Intercom Broadcasting System是中国海康威视(Hikvision)公司的一个对讲广播系统。 0x02 漏洞概述 Hikvision Intercom Broadcasting System 3.0.3_20201113_RELEASE(HIK)版本存在操作系统命令注入漏洞,该漏洞源于文件/php/ping.php的参数jsonda…

阿里云k8s集群搭建

文章目录 一、安装前准备1.环境2.k8s集群规划 二、k8s 安装1. centos基础设置2. docker 安装3. k8s安装3.1 添加阿里云 yum 源3.2 安装 kubeadm、kubelet、kubectl3.3 部署 Kubernetes Master3.4 加入 Kubernetes Node3.5 部署 CNI 网络插件3.6 测试 kubernetes 集群 一、安装前…

Python | Flask测试:发送post请求的接口测试

HTTP/1.1 协议规定的 HTTP 请求方法有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 几种。POST通常用来向服务端提交数据,主要用于提交表单、上传文件。 HTTP 协议是以ASCII码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为…

浅析:智能化视频安全监管系统的设计与实现步骤

关于智能化视频监管方案,小编已经和大家分享了很多,今天就和大家来探讨一下关于智能化视频安全监管系统的设计与实现步骤。 首先需要分析需求。要与使用者和业务部门合作,明确系统的功能和需求,例如,确定监控区域、安…

MyBatis——MyBatis的原始Dao开发(了解)

MyBatis的原始Dao开发-了解 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方式和Mapper接口代理开发方式。而现在主流的开发方式是接口代理开发方式,这种方式总体上更加简便。在之前的文章已经给大家介绍了基于代理方式的dao开发&#x…

在scrapy 使用selenium模拟登录获取cookie

前言 最近有一点点爬虫需求,想总结一下scrapy框架的一些基本使用方法,加深印象,自己一直习惯使用一些脚本文件运行爬虫,面对数据量非常大,稳定性要求比较高的,效率需求比较高的情况下还是用scrapy较为合适…

Azure Machine Learning - 提示工程高级技术

本指南将指导你提示设计和提示工程方面的一些高级技术。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师&#xff0c…

Python MySQL数据库连接实现增删改查

一、应用场景 python项目连接MySQL数据库时,需要第三方库的支持。这篇文章使用的是PyMySQL库,适用于python3.x。 二、安装 pip install PyMySQL三、使用方法 1.导入模块 import pymysql2.连接数据库 db pymysql.connect(hostlocalhost,usercode_s…

【Linux 驱动】Linux设备树(四)—— 设备树驱动LED

有了设备树以后,我们可以将寄存器信息保存到设备树,即便是更换了一个设备,我们也无需修改驱动文件,只需要修改设备树文件并重新编译。 下面介绍两种通过设备树驱动 LED 的最简单的方式,这两种方式的主要是设备树中 re…

什么是触控芯片?触控芯片有哪些?

一、什么是触控芯片? 触控芯片是一种用于感知人机交互行为的电子元器件,通过感应人体肌肉、电容电场和压力等多种信号,实现触摸屏幕、手势操作、手写输入等功能。二、触控芯片的工作原理 触控芯片的工作原理基于电容原理,当人体肌…

一文读懂PMP项目管理

PMP项目管理是什么 PMP(Project Management Professional)指项目管理专业人员资格认证,由美国项目管理协会(Project Management Institute,简称PMI)发起,目前已在全球206个国家和地区进行认证&…

小黑南京归来,参加部里的公务员培训,有点儿社死认识了好多小伙伴的leetcode之旅13. 罗马数字转整数

小黑代码 class Solution:def romanToInt(self, s: str) -> int:chars [M, CM, D, CD, C, XC, L, XL, X, IX, V, IV,I]nums [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]map_ dict((k, v) for k,v in zip(chars, nums))# 字符串长度n len(s)# 结果变量res …

Java集合转int数组

集合通过toArray()方法进行转换为数组&#xff0c;可以转换成为指定类型的数组&#xff0c; 【但是】这些类型都必须是object类型的子类&#xff0c;基本类型不可以。 可以通过stream流处理&#xff1a; Set<Integer> set new HashSet<>(); int[] result interSet…

Swagger2解放双手的API开发文档生成

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《MyBatis-Plus》。&#x1f3af;&#x1f3af; &am…

NFS原理详解

一、NFS介绍 1&#xff09;什么是NFS 它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录。 NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的NFS客户端中。 在本地的NFS客户端的机器看来&#xff0c;NFS服务器端共享的目录就好像自己的磁…

Tomcat为什么要重写类加载器?

文章目录 一、双亲委派机制二、分析1、Tomcat需要隔离性2、Tomcat需要热替换3、打破双亲委派机制 三、Tomcat类加载器1、拓展类加载器2、工作原理 四、总结 一、双亲委派机制 首先了解下双亲委派机制&#xff0c;大致过程如下&#xff1a; 简单来说&#xff0c;就是加载class…

ansible(不能交互)

1、定义 基于python开发的一个配置管理和应用部署工具&#xff0c;在自动化运维中异军突起&#xff0c;类似于xshell一键输入的工具&#xff0c;不需要每次都切换主机进行操作&#xff0c;只要有一台ansible的固定主机&#xff0c;就可以实现所有节点的操作。不需要agent客户端…