java方法的重载

news2024/9/20 9:29:32

 

java中有很多方法是可以通过重载的方式实现的,这是 Java语言的一大特色,但是同时也为开发人员带来了一些麻烦,不知道怎么去调用这些方法,而且还容易出现一种情况就是:明明已经调用过了一个方法,但为什么又要去调用另一个方法?难道这个方法的名字不同吗?那又有什么关系呢?这些都是我们在学习和使用 java语言时要面对的问题。其实这里面最主要的问题还是在于重载的时候,不能保证每个方法都被正确调用。 当我们对同一个对象进行多次调用时,就会出现上面所说的情况。比如我们调用一个方法,当这个方法被调用次数达到一定程度后,这个方法就会被异常抛出了。对于这种情况, java中有一种非常经典的解决方案,那就是将这个方法进行重写。 重写也叫修改、替换或覆盖等。其基本思想是:对同一个对象或方法进行多次重复调用(即多次调用同一个参数)。这样做有两个好处:首先,由于每个重写后的方法都不同,所以不会出现一次重写就能把所有方法都重新做一遍的情况了;其次,由于每个重写后的方法都不同,所以不会出现某个重写后的方法被覆盖或调用时不能正常返回结果等问题。重写后的代码会自动地覆盖掉原来的代码段和变量、常量等。

  • 一、方法的重载

    在多个方法中实现相同的功能,将其重写为不同的方法,可提高程序的可重用性。这样做,就可以避免一个方法多次被调用时,它的同名方法又要重新做一次。即在一个类中创建多个同名的子类,然后在这些子类中重写相同的方法。从实现上看,如果没有实现重载,那么就会出现同一个方法在不同的类中被重复调用的情况。由于在很多时候,我们所需要使用的方法不可能是只有一种类型的,因此我们可以通过重载来实现相同类型方法之间的互相调用。通过重写方法,就可以实现同类型方法之间的互相调用。 那么重写后的方法有什么不同呢?重写后方法和原类中同类方法所采用的关键字是一样的,在重新编译时被当作一个新类来对待。即同一个方法,在不同的类中被分别调用两次(如果是多个不同类中被重复调用)。因此我们可以说重写后的方法与原类是一样的。 具体实现如下: 上面这段代码中就实现了两个类之间同类型方法之间的重载,即: 以上代码中使用了“null”关键字来返回一个类型为 null、但其值为 false的异常状态代码段。由于这个异常状态是一个在程序运行过程中所不会出现和处理过的异常状态,因此我们在重新编译时会忽略掉这个异常状态代码段。但是在程序运行结束后,就会发现这个异常状态是一个真实存在、并且能处理掉这种异常状态代码段。 以上两个例子是典型的多个方法重写后实现相同功能、不同类之间被重写为相同类型、但其同名方法不同且其值也不同、但其名相同且其值不同这四种情况。对于这些情况,我们在实际编程时应该根据具体情况来确定哪个是第一种情况,哪个是第二种情况,然后再结合重载来选择相应代码段。

  • 二、多个方法同时调用

    当我们需要调用多个方法时, Java语言给了我们一种解决方法,那就是把每个方法的名称都加一个数字。如果这个数字和某个参数的值一样,那么这个方法就可以被调用两次。这里为什么要多一个数字呢?其实也是为了在多个方法之间进行区分。 所以我们在调用一个方法时,就要先检查一下是否有异常情况,如果没有异常情况,那就可以继续调用了。 当我们使用多个方法来调用时,其实还有另外一种方式可以解决这个问题。当我们对某一个参数进行多次修改时,如果还想再对其进行调用的话,那么只需要修改参数的值就可以了。比如: 当我们想对两个参数进行修改时,只需要将参数的值进行修改即可。其实这里的修改过程与上面所说的一样,只是这里修改后的结果是从两个参数变成了一个参数。 另外,当我们想要对多个方法进行调用时,还可以用到重载的方式。在这个例子中: 此时我们并没有使用重写的方式来实现以上两种情况,而是将一个方法进行了重写。所以在调用这个方法时就可以正常地返回结果了。而对于我们上面所说的两种情况:

  • 三、代码优化

    1.多个方法共用同一个参数。对于多个方法共用同一个参数时,我们可以通过将方法名称进行合并来减少重复调用的次数,从而提高代码的可读性。对于常用的多个方法,可以直接在方法名上加上参数即可,如: 2.减少循环。在使用循环语句时,我们可以将循环语句进行拆分,比如上面的例子中,我们将两个循环语句进行合并,并且通过判断这两个循环语句是否包含在一个大的循环里来减少循环次数。当然在使用这个方法时,一定要注意是在同一类型的变量中使用。 3.将常量名改为方法名。如果我们要调用一个方法来进行数据操作,那么这个方法的常量名就不能再使用了,这时我们可以将这个常量名改为方法名来代替。 4.使用局部变量。当我们调用一个方法时,由于这个方法是对该对象进行操作的,所以我们可以将这个局部变量放在这个对象内部。这样就避免了整个代码都重新写一遍的问题了。 5.使用 public static final修饰符。对于一些需要 final修饰的语句,我们可以将其放在变量声明之后再调用该变量。 6.使用 final关键字修饰参数。如果参数是一个常量时,我们可以直接使用 final关键字进行修饰;如果参数是一个变量时,我们可以使用 final关键字进行修饰;如果参数是一个类或者对象时,我们可以使用 final关键字进行修饰。 7.不要使用 mutation ()。mutation ()是一个非常典型的 Object类的方法调用函数,在该函数中不能对任何非 Object类对象进行调用。所以当我们在使用 mutation ()时,一定要先确定我们是否需要调用这个方法来对对象进行操作,如果需要的话,再来选择是否调用该方法。 8.不要让一个类被多个方法访问。Java的虚拟机管理工具(虚拟机管理器)会记录一个对象在不同类中被访问的次数。如果我们让多个对象同时访问同一个资源时,那么虚拟机将会把这些对象分别放在不同的文件夹中来进行管理。这样就会出现一个问题:如果一个对象被多个方法访问的话,那么当这个对象被调用时,其他的方法就会在一个文件夹中找到该对象并对其进行调用了。

  • 四、总结

    通过上面的分析,我们已经知道了 java中方法重载的一些基本思想,以及它对我们开发人员带来的好处,那么我们应该如何正确使用这些方法呢?下面就简单谈一下我个人的理解和看法。 首先,对于一个 Java类而言,它必须要有一个或多个方法来实现它的功能。那么问题来了,一个 Java类到底应该有多少个方法呢?对于这个问题, Java语言的设计者是这样规定的:如果没有定义一个方法名为 static的类,那么 Java类应该有8个以上方法(或者方法名中至少包含4个数字);如果没有定义一个方法名为 static的类,那么 Java类应该有20个以上方法(或者方法名中至少包含5个数字)。 其次,对于一个需要多个线程来运行的代码而言,应该给每个线程都分配一个名字为 static的函数来实现它的功能。如果没有给每个线程分配这个函数,那么这些线程都会对同一个 static函数进行调用,那么将会出现问题:当多个线程对同一个 static函数进行调用时,程序就会崩溃。 最后,对于一个需要用到多个文件夹来存储数据的代码而言。

Java方法的重载指的是在同一个类中,方法名相同但参数列表不同的多个方法。以下是一个简单的例子:
```
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
}
```
在上面的例子中,`Calculator`类中定义了三个名为`add`的方法,它们的参数列表分别为`(int, int)`、`(double, double)`和`(int, int, int)`。这三个方法都是重载方法。
当我们调用`add`方法时,Java会根据传入的参数类型和数量来自动匹配对应的方法。例如:
```
Calculator calculator = new Calculator();
int result1 = calculator.add(1, 2); // 调用第一个add方法,返回3
double result2 = calculator.add(1.5, 2.5); // 调用第二个add方法,返回4.0
int result3 = calculator.add(1, 2, 3); // 调用第三个add方法,返回6
```
注意,方法的返回类型不是方法重载的条件,只有方法名和参数列表才是。

以下是几个常用的Java方法的重载代码:
1. 计算两个整数的和
```
public static int add(int a, int b) {
return a + b;
}
public static double add(double a, double b) {
return a + b;
}
```
2. 判断一个字符串是否包含另一个字符串
```
public static boolean contains(String str, String subStr) {
return str.contains(subStr);
}
public static boolean containsIgnoreCase(String str, String subStr) {
return str.toLowerCase().contains(subStr.toLowerCase());
}
```
3. 获取数组中的最大值和最小值
```
public static int getMax(int[] arr) {
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
public static double getMax(double[] arr) {
double max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
public static int getMin(int[] arr) {
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
return min;
}
public static double getMin(double[] arr) {
double min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
return min;
}
```

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

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

相关文章

Ansys Zemax | 如何模拟双折射偏振器件

这篇文章介绍了什么是双折射现象、如何在OpticStudio中模拟双折射 (birefringence)、如何模拟双晶体的双折射偏振器以及如何计算偏振器的消光比。&#xff08;联系我们获取文章附件&#xff09; 什么是双折射现象 一般的光学材料都是均匀的各向同性的&#xff0c;也就是说无论光…

等级保护、风险评估和安全测评分别是什么?

2022-06-17 15:17 迈入“等保2.0时代”以后&#xff0c;我国对于等级保护的要求更为严格和具体。等级保护、风险评估和安全测评这三个词&#xff0c;也因此总是出现在人们的视野之中&#xff0c;还总是被混淆。那这三者究竟分别是什么呢&#xff1f;如何区分它们&#xff1f;它…

如何以产品经理思维打造一所高品质学校?

学校的建设与管理真不是一件容易事。2023年03月17日&#xff0c;山东菏泽市曹县一家长投诉某中学课业繁重&#xff0c;孩子经常写作业到半夜&#xff1b;2023年4月4日&#xff0c;张先生在华龙网重庆网络问政平台投诉万州区某中学伙食差&#xff0c;指出“发灰的洋葱&#xff0…

本地运行 minigpt-4

1.环境部署 参考官方自带的README.MD&#xff0c;如果不想看官方的&#xff0c;也可参考MiniGPT-4&#xff5c;开源免费可本地进行图像对话交互的国产高级大语言增强视觉语言理解模型安装部署教程 - openAI 当然&#xff0c;所有的都要按照作者说明来&#xff0c;特别是版本号…

练好基本功,优秀工程师成长第一步

计算机基础作用 举例1&#xff1a;若是我们要开发大规模应用系统&#xff0c;如电商服务系统&#xff0c;要考虑很多 1. 这个服务应用要用什么语言来编写&#xff1f; 2. 是采用单体进程&#xff0c;还是用多个进程来协同工作&#xff1f; 3. 如何管理长期使用的内存空间&a…

( 栈和队列) 155. 最小栈 ——【Leetcode每日一题】

❓155. 最小栈 难度&#xff1a;中等 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。…

WiFi电子标签简介

WiFi电子标签系统概述&#xff1a; WIFI电子办公标牌系统是一种先进的无线自动更新系统&#xff0c;取代了传统的纸质标牌/桌牌需要人工更换的方式。WIFI ESL系统只需要一个电子办公标志设备&#xff0c;让它在办公或会议空间工作&#xff0c;快速改变人员或会议信息。这是一种…

Docker -compose 安装使用

命令 总结 yum install docker-compose-plugin docker compose version docker compose up docker compose up -d相关的配置。 创建docker-conpose 目录&#xff0c;并创建docker-compose.yml文件 version: 3 services: mysql: image: mysql restart: always co…

【基础算法】二叉树相关题目

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招算法的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于代码随想录进行的&#xff0c;每个算法代码参考leetcode高赞回答和…

[ICLR 2023] Token Merging: Your ViT But Faster

Contents IntroductionToken MergingExperimentsImage ExperimentsDesign choicesModel SweepComparison to Other WorksVisualizations Video ExperimentsAudio Experiments References Introduction 作者提出了一种 token 合并方法 Token Merging (ToMe)&#xff0c;能够在不…

【Tasking_IDE】-1-如何让目录下的C文件不参与编译

案例背景&#xff1a; 当您在使用Tasking TriCore Eclipse IDE集成开发环境编译时&#xff0c;是不是有时遇到这样一个问题&#xff1a;导入了一个算法/驱动文件夹&#xff0c;但文件夹里面不是所有的C文件都要参与编译&#xff0c;于是您可能想到把这些“不参与编译的文件”删…

Kafka3.0.0版本——生产者 数据去重

目录 一、数据传递语义1.1、至少一次1.2、最多一次1.3、精确一次 二、幂等性2.1、幂等性原理2.2、重复数据的判断标准2.3、如何使用幂等性 三、生产者 事务3.1、Kafka事务原理3.2、Kafka事务注意事项3.3、Kafka事务的5个API3.3.1、初始化事务API3.3.2、开启事务API3.3.3、在事务…

CMake Tutorial Step1

CMake Tutorial Step1 参考资料&#xff1a;Step 1: A Basic Starting Point — CMake 3.26.3 Documentation Tutorial工程&#xff1a;官方Tutorial工程 开发环境&#xff1a;CLion CMake简介 方便起见直接问New Bing。 为什么要学习CMake&#xff1f; CMake的最大特点和…

微服务---分布式搜索引擎 elasticsearch基础

分布式搜索引擎 elasticsearch基础 0.学习目标 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; 在GitH…

centos7操作yum命令失败

前言设置网卡开机自动启动设置国内dns服务器系统修改CentOS-Base.repo中的地址 前言 刚安装完的CentOS7的系统&#xff0c;发现无法使用yum命令进行更新&#xff0c;在更新的时候会出现下面这种内容&#xff0c;为此问题有以下这些解决方案可以尝试。 One of the configured r…

两段视频合成一个视频用什么软件 怎么把两段视频合成一段看不出来

两段视频合成一个视频用什么软件&#xff1f;无论是两段视频的合成&#xff0c;还是三段视频的合成&#xff0c;用视频编辑软件都能轻松搞定。但怎么把两段视频合成一段看不出来&#xff1f;这就比较考验制作者的功力了&#xff0c;不过我们还是有捷径的&#xff0c;下面一起来…

new和delete

目录 malloc: 开辟失败&#xff1a;返回值为空指针 new: 内置类型&#xff1a; 申请一个int对象&#xff08;开辟一块存储int类型数据的空间&#xff0c;只能存储一个int数据&#xff09;&#xff1a; 申请5个int对象&#xff08;开辟一块存储int类型数据的空间&#xff…

Blender3.5 边的操作

目录 1. 边操作1.1 边的细分 Subdivide1.2 边的滑移 Edge Slide1.3 边的删除1.4 边的溶解 Dissolve1.5 边线倒角 Bevel1.6 循环边 Loop Edges1.7 并排边 Ring Edges1.8 桥接循环边 1. 边操作 1.1 边的细分 Subdivide 在边选择模式&#xff0c;选中一条边&#xff0c;右键&…

JVM系列(十一) 垃圾收集器之 Concurrent Mark Sweep 并发标记清除

垃圾收集器之 Concurrent Mark Sweep 并发标记清除 上几篇文章我们讲解了单线程垃圾收集器 Serial/SerialOld ,多线程垃圾收集器 Parallel Scavenge/Old, 本文我们讲解下 Concurrent Mark Sweep 简称CMS垃圾收集器 垃圾收集器 新生代收集器&#xff1a; Serial、ParNew、Par…

图解 | 原来这就是网络

​​ 你是一台电脑&#xff0c;你的名字叫 A 很久很久之前&#xff0c;你不与任何其他电脑相连接&#xff0c;孤苦伶仃。 ​ 直到有一天&#xff0c;你希望与另一台电脑 B 建立通信&#xff0c;于是你们各开了一个网口&#xff0c;用一根网线连接了起来。 ​ 用一根网线连接起来…