【JavaSE】函数or方法?方法的重载讲解

news2024/11/28 18:41:39

文章目录

  • 什么是方法
  • 如何定义方法
  • 方法的调用过程
    • 形参与实参的关系
  • 方法的重载
    • 为什么要重载
    • 重载的概念
    • 方法签名
  • 递归

什么是方法

在C语言的学习中我们学习到了一个概念叫做函数,那么在Java的语法中有没有类似函数的东西的,答案是有的,但是在Java的语法中不叫函数,我们成为方法。什么是方法呢?我们通过一段代码来体会一下方法:

    public static int add(int x,int y ) {
        return x + y;
    }

    public static void main(String[] args) {
        int x = 10;
        int y = 20;
        int z = add(x,y);
        System.out.println(z);

        int a = add(1,44);
        System.out.println(a);
    }

上面的代码我们就定义了一个可以实现两个数相加方法,这样看这个方法的作用不是很明显,因为方法中完成的功能十分简单,如果功能十分复杂并且在项目中这个功能被使用多次,难道每次使用我们都要重新写一遍码?我们可以把这个功能用方法模块化起来,每次使用只需要调用方法就可以了。所以总结一下方法的功能:

1、当一个功能十分复杂时,方法可以模块化的组织代码
2、方法可以做到让代码重复使用,在多个位置使用
3、让代码更好理解
4、直接调用现有的开发方法,不需要重复造轮子。

如何定义方法

好了我们知道了什么是方法之后,我们该如何在自己的代码中使用方法呢?让我来告诉大家:

方法的语法格式
访问修饰符 返回值类型 方法名称 (参数类型 形参…) {
方法体代码;
return 返回值;
}

使用这样的语法我们就可以在我们的代码中定义一个方法,让我们来尝试写一个求两个数的较大值的方法吧:

  public static int max(int x,int y) {
        return x > y ? x : y;
    }

这样我们就写了一个求最大值的方法,我么来对这个方法分析一下:

public static :访问修饰符,现阶段直接使用public static 固定搭配
int :返回值类型
max:函数的名字
(int x , int y): 形参
return x > y ? x : y;:返回值
花括号里面的就是方法体

方法写完了,我们该如何使用方法呢?定义方法的时候方法不会执行的,只有我们调用的时候方法才会被执行,并且方法可以被多次调用

方法名(参数类型 实参…)

我们来调用一下我们的方法:

  public static int max(int x,int y) {
        return x > y ? x : y;
    }

    public static void main(String[] args) {
        int max = max(5,8);
        System.out.println("第一次调用:" + max);
        int max2 = max(10,50);
        System.out.println("第二次调用:" + max2);
    }

在这里插入图片描述
上面就是我们执行的结果。

方法的调用过程

我们先来大致的说一下方法的调用过程,我们调用方法 - > 传递参数 - > 找到方法的地址 - > 执行被调用方法的方法体 - > 被调用的方法结束返回 - > 回到主方法继续执行
我们先写一个简单的代码:

 public static int add(int x , int y) {
        return x + y ;
    }

    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int num = add(a,b);
        System.out.println(num);
    }

那么这个方法是如何被调用的呢?我们通过画图来向大家解释:
在这里插入图片描述

最后当add方法结束后,在栈上为add方法开辟的空间会被回收,之后返回主方法继续执行,当主方法执行完毕,主方法的空间也会被回收。

形参与实参的关系

我们来看一段代码:

   public static void swap(int x ,int y) {
        int tmp = x;
        x = y;
        y = tmp;
    }
    
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        swap(a,b);
        System.out.println(a);
        System.out.println(b);
    }

这个swap方法会不会把交换a和b两个变量的值呢?我们执行以下看看结果
在这里插入图片描述
答案是并没有,原因是什么呢?在上面我们介绍了方法调用的过程,我们知道了在调用时swap方法和main方法各自开辟属于各自的栈帧,ab变量在main函数所在的栈帧中,而xy在swap所在的栈帧中,ab变量和xy变量,没有任何关系,所以我们交换了xy并不会对ab的值造成任何影响。总结以下:在swap方法调用时,只是将实参a和b中的值拷贝了一份传递给了形参x和y,因此对形参x和y操作不会对实参a和b产生任何影响

方法的重载

为什么要重载

先让我们来看一个例子吧,还是求两个数相加的方法

  public static int add(int x,int y ) {
        return x + y;
    }

    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        double c = 10.3;
        double d = 9.9;
        int e = add(a,b);
        System.out.println(e);
        
    }

现在我写了一个返回值类型为int参数类型为int ,int的方法,但是现在两个int类型的变量相加我们可以使用这个add方法,如果我们有两个double类型的变量,就不可以使用add方法了,有一个非常简单粗暴的方法,就是我们再写一个方法。

    public static int add(int x,int y ) {
        return x + y;
    }

    public static double add_double(double x,double y) {
        return x + y;
    }
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        double c = 10.3;
        double d = 9.9;
        int e = add(a,b);
        System.out.println(e);
        double f = add_double(c,d);
        System.out.println(f);
    }

在这里插入图片描述
上面的代码解决了问题,但是我们需要提供许多不同的方法名,而取名字本来就很让人头疼,我们是否可以将所有名字都写成add呢?这时就要使用到我们的方法重载了。

重载的概念

在我们的日常生活中,经常会出现一词多义的现象,例如:你的女朋友对你说你是个好人和你帮助他人时,别人对你说的你是个好人,所代表含义是不一样的。出现这样的情况我们就可以说该词被重载了。在Java中,如果多个方法的名字相同,参数列表不同,则称该种方法被重载了

    public static int addNum(int x ,int y) {
        return x + y;
    }
    
    public static double addNum(double x ,double y) {
        return x + y;
    }
    
    public static int addNum(int x ,int y ,int z) {
        return x + y + z;
    }
    
    public static double addNum( double x , int y ) {
        return x + y; 
    }

    public static void main(String[] args) {
        int a =addNum(10,20);
        double b = addNum(10.4,2.5);
        double c = addNum(10.4,5);
        int d = addNum(10,20,30);
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
    }

上面这个代码演示了Java中方法的重载,有些地方值得我们注意:

1、重载时方法名必须相同
2、参数列表必须不同(参数的个数、类型、次序不同)
3、与返回值类型是否相同无关
4、编译器在编译代码时,会对形参类型进行推演,根据推演的结果来确定调用哪个方法

在这里插入图片描述
这样写是不行的,因为重载与返回值类型是否相同无关。有点同学会想到了,我们把名字都写成一样的化,如果这个方法重载了很多次我记不住自己写了那些方法怎么办呢?我们的IDEA非常的聪明,会在我们调用方法时给出我们提示:
在这里插入图片描述

方法签名

有些兄弟在看完重载后会产生一些疑问,为什么在方法内定义变量,不可以定义两个名字一样的变量,在类中的方法就可以定义两个一模一样名字的方法呢?这就要提到方法签名了,在经过编译器编译修改之后的方法最终的名字我们成为方法签名。
具体方式方法全路径名 + 参数列表 + 返回值类型构成方法完整的名字。

我们可以在编译过后,使用JDK自带的javap反汇编工具查看方法签名:

1、先对工程进行编译,生成.class字节码文件
2、在控制台中进入到.class所在的目录
3、输入java -v 字节码文件名即可

在这里插入图片描述

递归

在C语言函数部分的学习中,我们也曾提到递归的概念,简单来说就是一个函数自己调用自己,我们就称为递归,那么我们就可以类比出,在Java中的递归就是方法自己调用自己。对递归的概念不太熟悉的可以去看看博主的这篇文章:函数的递归
我们通过一道练习题来感受如何使用Java实现递归吧,我们使用递归求n的阶乘

 public static int getNum(int x ) {
        if(x == 1) {
            return 1;
        }
        return x * getNum(x - 1);
    }

    public static void main(String[] args) {
        int num = getNum(5);
        System.out.println(num);
    }

这样我们就完成了题目,是不是跟C语言中的递归方式一样呢。最后总结一下递归的两个必要条件吧:

1、需要有递归的出口,上面代码当形参等于 1 时 就是递归的出口
2、将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同

递归还有一些经典例题,例如汉诺塔问题,他家可以看看我的这篇文章:经典递归问题汉诺塔 这篇文章使用的C语言完成了汉诺塔问题,大家可以尝试着使用Java实现一下。

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

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

相关文章

strimzi实战之一:简介和准备

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于strimzi strimzi是一个开源项目,已加入了CNCF,官网地址:https://strimzi.io/借助strimzi,既能快速部署ka…

【生日快乐】搜索技术【深度优先搜索】 - 回溯法

搜索技术【深度优先搜索】 - 回溯法 回溯法是一种选优搜索法,按照选优条件深度优先搜索,以达到目标。当搜索到某一步时,发现原先的选择并不是最优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术被称为回…

如何用 Elasticsearch 实现 Word、PDF,TXT 文件的全文内容检索?

简单介绍一下需求 能支持文件的上传,下载 要能根据关键字,搜索出文件,要求要能搜索到文件里的文字,文件类型要支持 word,pdf,txt 文件上传,下载比较简单,要能检索到文件里的文字&am…

2022-ISCTF-部分MISC和PWN

misc 两层编码 第一层 sha256掩码爆破 第二层 base64解码找到key import string,sys from hashlib import sha256 from multiprocessing import Process from Crypto.Util.number import * from pwn import * import base64 from primefac import * context(log_leveldebug)…

【STL】容器 - set和map的使用

目录 前言 一.键值对 1.在SGI - STL中对键值对的定义: 2.make_pair 二.set 1.set的概念与注意事项 2.set的使用(常用接口) <1>.构造函数 <2>.迭代器与范围for <3>.插入和查找 <4>.删除erase <5>.计数count 三.map 1.map的概念与注…

洛谷千题详解 | P1012 [NOIP1998 提高组] 拼数【C++、Java语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; C源码2&#xff1a; C源码3&#xff1a; Java源码&#xff1a; ---------------------------------------------------------…

element-ui upload图片上传组件使用

图片上传前端收集 数据 再调用接口发送到后端 组件标签内的参数&#xff1a; 参数说明类型可选值默认值action必选参数&#xff0c;上传的地址string——headers设置上传的请求头部object——multiple是否支持多选文件boolean——data上传时附带的额外参数object——name上传…

【数据结构】链表OJ第一篇 —— 移除链表元素 反转链表 合并两个有序链表

文章目录0. 前言1. 移除链表元素2. 反转链表3. 合并两个有序链表4. 结语0. 前言 上篇博客中&#xff0c;我们学习了实现了单链表。但是仅仅实现并不算掌握&#xff0c;所以我们需要做些题目来练习巩固。而从今天开始的几期&#xff0c;anduin 都会为大家带来链表OJ题&#xff…

在Linux环境下VScode中配置ROS、PCL和OpenCV开发环境记录

一.安装必要的插件 打开VScode&#xff0c;在开展中安装CMake、CMake Tools&#xff0c;ROS和catkin-tools插件&#xff0c;截图如下&#xff0c;安装后重新打开VScode插件生效。 二.创建ROS工作空间 在选择的路径下&#xff0c;打开终端创建工作空间&#xff0c;具体命令如下…

【概率论笔记】正态分布专题

文章目录一维正态分布多维正态分布n维正态分布二维正态分布一维正态分布 设X~N(μ,σ2)X\text{\large\textasciitilde}N(\mu,\sigma^2)X~N(μ,σ2)&#xff0c;则XXX的概率密度为f(x)12πσe−(x−μ)22σ2f(x)\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}}f(…

WXML模板语法

文章目录1、数据绑定1.1 数据绑定的基本原则1.2在data中定义页面的数据1.3 Mustache语法的格式1.4 Mustache语法的应用场景1.5 算数运算2、事件绑定2.1 小程序常用的事件2.2事件对象的属性列表2.3 target和currentTarget的区别2.4 <font colorred>bindtap的语法格式2.5 在…

狗厂员工来面试本想难为一下,结果被虐得连console.log也不敢写了

这次说到的面试题是关于node服务端内存溢出的问题&#xff0c;狗厂员工来面试本想难为一下&#xff0c;现在我连console.log也不敢写了 关于这道node内存溢出的问题&#xff0c;大哥从以下几个方面讲的&#xff0c;讲完我觉得自己得到了升华&#xff0c;现在搞得连代码也快不敢…

2.24 OrCAD Cadence16.6怎么更改原理图中做好的库文件?

笔者电子信息专业硕士毕业&#xff0c;获得过多次电子设计大赛、大学生智能车、数学建模国奖&#xff0c;现就职于南京某半导体芯片公司&#xff0c;从事硬件研发&#xff0c;电路设计研究。对于学电子的小伙伴&#xff0c;深知入门的不易&#xff0c;特开次博客交流分享经验&a…

FPGA代码设计规范一些探讨

代码设计规范的重要性 经过一段的工作积累已经慢慢进入了提高和进阶的阶段&#xff0c;在这篇博客里多聊一聊在现实工作中的话题&#xff0c;比如代码规范以及如何尽快接手前人代码&#xff0c;快速定位项目问题。 显然每个FPGA工程师的设计理念和代码风格很多情况下有一些差别…

python 基于PHP+MySQL的学生成绩管理系统

学生成绩管理是每一个学校都会面临的一个问题,传统的管理模式已经明显到和时代不同步。通过我对当前学校成绩管理的需求和自己的实习经验整理出了一个能够满足大多数学校的学生成绩管理系统。本系统分为管理人员,教师和学生三种用户,每种用户各负责其一部分功能然后通过他们的整…

Web前端开发基础教程二

注释和特殊字符&#xff1a; 如果需要在html文档添加一些便于阅读和理解但又不需要显示在页面中的注释文字&#xff0c;就需要使用注释标签。 html中的注释以“<!--”开头&#xff0c;以“-->”结束或者快捷键&#xff1a;Ctrl/。 举例&#xff1a; <!-- 我想放假 …

【实战】Mysql 千万级数据表结构变更 、含脚本

一、实测结果 业务无感知&#xff0c;无死锁平滑 线上800万数据以下 直接使用 alter 新增字段 300ms左右 2000万数据&#xff0c;强制使用主键索引&#xff0c;每次查询50万数据 并插入新表 &#xff0c;耗时 20s &#xff0c;cpu 占45% 二、整体步骤 创建新表 biz_table_ne…

Vue-脚手架的创建

本篇vue3的脚手架主要是使用vue-cli进行创建&#xff0c;有网的情况下才能创建成功 文章目录一、下载node.js二、全局安装vue/cli三、使用vue-cli创建项目3.1 使用vscode打开终端3.2 创建项目3.3 创建成功四、注意事项一、下载node.js 1、打开node的官网 node官网 2、点击下方图…

Oxygen XML Editor 25.0.X Crack

XML 编辑器 Oxygen XML Editor 是完整的 XML 编辑解决方案&#xff0c;适用于 XML 开发人员和内容作者。它提供了必备的 XML 编辑工具&#xff0c;涵盖了大多数 XML 标准和技术。Oxygen XML Editor 包括 Oxygen XML Developer 和 Author 的所有功能。 特点与技术 单一来源出版 …

【树莓派不吃灰】使用frp内网穿透,实现远程访问树莓派

目录1. 前言2. frp内网穿透2.1 概述2.2 实现原理3. 开源frp项目4. 公网服务器选型5. 下载frp软件5.1 公网服务器下载frp服务器5.1.1 github选择适合服务端的版本5.1.2 公网服务器进行下载解压5.2 树莓派下载frp客户端5.2.1 github选择适合客户端的版本5.2.2 树莓派进行下载解压…