Java方法的使用(重点:形参和实参的关系、方法重载、递归)

news2024/11/18 20:32:30

目录

一、Java方法

     * 有返回类型,在方法体里就一定要返回相应类型的数据。没有返回类型(void),就不要返回!!     * 方法没有声明一说。与C语言不同(C语言是自顶向下读取代码),而Java是全局的,所以不管在main前面或者后面的方法(函数),都能被识别到。     * 同C语言一样,函数不能嵌套定义。Java的方法也不能嵌套定义。

二、实参和形参的关系

在Java中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体

 三、方法的重载

 1.在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。

  /**     * 方法重载     * 1.方法名 必须相同     * 2.参数列表不同(个数、类型、顺序)     * 3.返回类型不影响     */

2.方法签名

 四、递归


一、Java方法

同C语言一样,要反复实现一个效果和功能的时候,我们为了方便写了一个有一个函数去调用。Java的方法也类似。

 

     * 有返回类型,在方法体里就一定要返回相应类型的数据。没有返回类型(void),就不要返回!!
     * 方法没有声明一说。与C语言不同(C语言是自顶向下读取代码),而Java是全局的,所以不管在main前面或者后面的方法(函数),都能被识别到。
     * 同C语言一样,函数不能嵌套定义。Java的方法也不能嵌套定义。

    //方法不能嵌套定义!!!err!!!
//    public static void main1(String[] args) {
//        public static void main2(String[] args){
//
//        }
//    }
}


     * 且方法只能写在类当中
    

 举例:实现一个求两数之和的方法

public class Method{
// 方法的定义
public static int add(int x, int y) {
return x + y;
}
}

二、实参和形参的关系

Java中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体


    public static void swap(int a,int b) {
        int tmp = a;
        a = b;
        b = tmp;
    }
    public static void main3(String[] args) {
        int x = 10;
        int y = 20;
        System.out.println("交换前:x = "+x+" y = "+y);
        swap(x,y);//形参只是实参的临时拷贝,虽然在函数里交换了值,出了函数就会被销毁,并没有影响实参
        //不同于C语言,Java没有指针。如果希望改变实参,需要后期学到类和对象。
        System.out.println("交换后:x = "+x+" y = "+y);

    }

 

可以发现,交换前后并没有变化,也就是根本没有交换。

这其实并不是我们编写的方法有问题,而是 形参和实参的关系 没有理解

分析: 

 

实参 a b main 方法中的两个变量,其空间在 main 方法的栈 ( 一块特殊的内存空间 ) 中,而形参 x y swap 方法中 的两个变量,x y 的空间在 swap 方法运行时的栈中,因此:实参 a b 与 形参 x y 是两个没有任何关联性的变量, swap 方法调用时,只是将实参 a b 中的值拷贝了一份传递给了形参 x y ,因此对形参 x y 操作不会对实参 a b
产生任何影响。
注意:对于 基础类型 来说 , 形参相当于实参的拷贝 . 传值调用

 三、方法的重载

以add举例,这里定义的求两数之和的的参数,是int和int,那假如我要求float和float的和呢?

public class Method{
// 方法的定义
public static int add(int x, int y) {
return x + y;
}
}

可以在定义个add2

public class Method{
// 方法的定义
public static int add2(float x, float y) {
return x + y;
}
}

但是还有其他类型都要一个一个重新定义方法吗?

 1.在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了

  /**
     * 方法重载
     * 1.方法名 必须相同
     * 2.参数列表不同(个数、类型、顺序)
     * 3.返回类型不影响
     */

例如:我这个两个方法都叫add,参数列表不同,就是方法重载。

方法重载的好处就是,只需要记住一个方法名,就可以调用实现相同的功能(尽管参数不同)


    public static int add(int a, int b) {
        return a + b;
    }
    public static double add(double a, double b) {
        return a + b;
    }
    public static void main3(String[] args) {
        System.out.println(add(4, 6));
        System.out.println(add(1.2,3.8));
    }

 

 

2.方法签名

在同一个作用域中不能定义两个相同名称的标识符。比如:方法中不能定义两个名字一样的变量,那 为什么 类中就可以定义方法名相同的方法 呢?
方法签名即:经过编译器编译修改过之后方法最终的名字。
具体方式: 方法全路径名+参数列表+返回值类型 ,构成 方法完整的名字。

以上面的add来看,虽然两个类都叫add,但是由于参数不同,构成的完整的方法名其实是不同的,这样也能区别两个类。 

上述代码经过编译之后,然后使用 JDK 自带的 javap 反汇编工具查看,具体操作:
1. 先对工程进行编译生成 .class 字节码文件
2. 在控制台中进入到要查看的 .class 所在的目录
3. 输入: javap -v 字节码文件名字即可

 

 四、递归

一个方法在执行过程中调用自身 , 就称为 " 递归 "。

例如:求n的阶乘,以及阶乘之和 

    public static long fac(long n) {
        int ret = 1;
        for (int i = 1;i <= n;i++){
            ret *= i;
        }
        return ret;
    }
    public static long facNum(long k) {
        long sum = 0;
        for (int i = 1; i <= k; i++) {
            sum += fac(i);
        }
        return sum;
    }
    public static void main2(String[] args) {
        long a = fac(5);
        System.out.println(a);
        long b = facNum(5);
        System.out.println(b);
    }

         每调用自己一次,就是递的过程,但是往下递的时候自己这个函数并没有销毁。(1,2,3,4就是递)等到最底层,无法继续递的时候,开始将结果,一层一层返回,这个就是归(5,6,7,8就是归)。返回一层,就将这个函数销毁。直到最后返回ret到main函数里。

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

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

相关文章

数电基础知识学习笔记

文章目录&#xff1a; 一&#xff1a;逻辑门 1.逻辑门电路的分类 1.1 按逻辑&#xff08;逻辑门&#xff09; 1.1.1 逻辑定义 1.1.2 常见数字电路相关符号 1.1.3 电路图表示 1.1.4 逻辑门电路图像符号 1.2 按电路结构 1.3 按功能特点 2.高低电平的含义 3.常见的门…

给定长度值length,把列表切分成每段长度为length的N段列表,Kotlin

给定长度值length&#xff0c;把列表切分成每段长度为length的N段列表&#xff0c;Kotlin import kotlin.random.Randomfun main(args: Array<String>) {var source mutableListOf<String>()val end Random.nextInt(30) 1for (i in 0 until end) {source.add(i.…

[SV] 文件操作

Verilog 提供了很多对文件进行操作的系统任务。经常使用的系统任务主要包括&#xff1a; 文件开、闭&#xff1a;​$fopen​, ​$fclose​, ​$ferror​文件写入&#xff1a;​$fdisplay​, ​$fwrite​, ​$fstrobe​, ​$fmonitor​字符串写入&#xff1a;​$sformat​, ​$…

python结合tesseract-ocr识别汉字的训练库过程

一、安装python 例如&#xff0c;安装路径为&#xff1a;C:\rtkapp\python-3.8.0 二、安装opencv 三、安装tesseract-ocr 安装完成后&#xff0c;在系统环境变量path中&#xff0c;添加安装路径C:\rtkapp\Tesseract-OCR 四、打开python安装pytesseract 五、安装java运行环境…

TenserRT(四)在 PYTORCH 中支持更多 ONNX 算子

第四章&#xff1a;在 PyTorch 中支持更多 ONNX 算子 — mmdeploy 0.12.0 文档 PyTorch扩充。 PyTorch转换成ONNX&#xff1a; PyTorch有实现。PyTorch可以转化成一个或者多个ONNX算子。ONNX有相应算子。 如果即没有PyTorch实现&#xff0c;且缺少PyTorch与ONNX的映射关系&…

太猛了,靠“吹牛”过顺丰一面,月薪30K

说在前面 在40岁老架构师尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常有小伙伴&#xff0c;需要面试美团、京东、阿里、 百度、头条等大厂。 下面是一个5年小伙伴成功拿到通过了顺丰面试&#xff0c;拿到offer&#xff0c;月薪30K。 现在把面试真题和参考答…

一起学算法(插入排序篇)

概念&#xff1a; 插入排序&#xff08;inertion Sort&#xff09;一般也被称为直接插入排序&#xff0c;是一种简单的直观的排序算法 工作原理&#xff1a;将待排列元素划分为&#xff08;已排序&#xff09;和&#xff08;未排序&#xff09;两部分&#xff0c;每次从&…

Python毕业设计可用小游戏:5个热门类型,引爆学生热情!每个类型附单独案例!

游戏大全 前言1.格斗技能类小游戏2.益智塔防类小游戏3.MMO类型游戏4.养成类游戏5.经济类游戏 总结 前言 大家好&#xff0c;我是辣条哥 在当今数字化时代&#xff0c;编程已经成为一项不可或缺的技能。而Python作为一门简洁易学的编程语言&#xff0c;正受到越来越多学生的青睐…

03_使用execle表生成甘特图

背景 每次排期都需要话很多时间 很可能排期还不对头 这时候需要一个表能看到 1.什么时候项目结束 开始 转阶段 2.当前手上的活能不能做完 当前阶段手上有多少活 3.产品经理每次修改完计划迅速排期 甘特图生成 execle表生成 1.需要使用亿图创建甘特图 2.把当前的甘特图数据进…

使用Excel建立贷款损失计算器

前几天上了一门Excel课程&#xff0c;掌握了一些新的小技能&#xff0c;比如模拟运算表和控件以及动态图表的使用&#xff0c;结合工作内容进行了下实操练习。 一、控件和动态图表的使用 以贷款产品的损益测算为例&#xff0c;计算在不同资金成本、获客成本、提前还款损失以及风…

SpringBoot2.5.6整合Elasticsearch7.12.1

SpringBoot2.5.6整合Elasticsearch7.12.1 下面将通过SpringBoot整合Elasticseach&#xff0c;SpringBoot的版本是2.5.6&#xff0c;Elasticsearch的版本是7.12.1。 SpringBoot整合Elasticsearch主要有三种方式&#xff0c;一种是通过elasticsearch-rest-high-level-client&am…

c++里的基础类 is_empty_v<_Ty1>

&#xff08;1&#xff09;为什么要研究这个问题&#xff0c;因为包括智能指针等很多源代码里都会使用 _Compressed_pair 这个类&#xff0c;其是一对值。研究这个类&#xff0c;就牵涉另一个更基础的类 is_empty_v<_Ty1> &#xff08;2&#xff09; is_empty_v<_Ty1&…

内部类(下)匿名内部类,静态内部类的使用

文章目录 前言一、匿名内部类二、静态内部类三、内部类的继承总结 前言 该文将会介绍匿名内部类、静态内部类的使用&#xff0c;补充完毕java中的内部类。补充内容为向上转型为接口、使用this关键字获取引用、内部类的继承。 一、匿名内部类 定义&#xff1a;没有名称的内部类。…

redis 淘汰策略和持久化

文章目录 一、淘汰策略1.1 背景1.2 淘汰策略 二、持久化2.1 AOF日志2.1.1 AOF配置2.1.2 AOF策略2.1.3 AOF缺点2.1.4 AOF Rewrite2.1.5 AOF Rewrite配置2.1.6 AOF Rewrite缺点2.1.7 fork进程时的写时复制2.1.8 大key对持久化的影响 2.2 RDB快照2.2.1 RDB配置2.2.2 RDB缺点 2.3 混…

二分查找算法(全网最详细代码演示)

二分查找也称 半查找&#xff08;Binary Search&#xff09;&#xff0c;它时一种效率较高的查找方法。但是&#xff0c;折半查找要求线性表必须采用顺序存储结构&#xff0c;而且表中元素按关键字 有序 排列。 注意&#xff1a;使用二分查找的前提是 该数组是有序的。 在实际开…

web前端常用调试工具

概述 当我们写 webapp 或者 移动端H5网页时&#xff0c;要在手机上调试并不容易。 alert&#xff1a;很早之前的调试办法&#xff08;已被抛弃&#xff09; vconsole&#xff1a;是2016年由微信公众平台前端团队推出&#xff08;目前大量使用&#xff09; eruda&#xff1a…

解读随机森林的决策树:揭示模型背后的奥秘

一、引言 随机森林[1]是一种强大的机器学习算法&#xff0c;在许多领域都取得了显著的成功。它由多个决策树组成&#xff0c;而决策树则是构建随机森林的基本组件之一。通过深入解析决策树&#xff0c;我们可以更好地理解随机森林模型的工作原理和内在机制。 决策树是一种树状结…

虚拟现实技术(VR)

目录 1.什么是虚拟现实技术 2.虚拟现实技术的由来 3.虚拟现实技术给人类带来的好处 4.虚拟现实技术未来的走向 1.什么是虚拟现实技术 虚拟现实技术&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;是一种通过计算机生成的模拟环境&#xff0c;使用户能够身临其境…

【js】经纬度位置获取navigator.geolocation.getCurrentPosition:

文章目录 一、经纬度位置获取navigator.geolocation.getCurrentPosition二、getCurrentPosition()在google chrome上不起作用 一、经纬度位置获取navigator.geolocation.getCurrentPosition 【文档】https://developer.mozilla.org/zh-CN/docs/Web/API/Window/navigator // 获取…

Redis 数据库高可用

Redis 数据库的高可用 一.Redis 数据库的持久化 1.Redis 高可用概念 &#xff08;1&#xff09;在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 …