《JAVASE系列》方法的使用 详解

系列文章目录

《JAVASE系列》

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

《JAVASE系列》方法的使用 详解

前言:

本章主要讲解java中的方法,以及如何使用方法。

参考书籍:《java核心卷1》

你若盛开,清风自来。

1.方法的概念与使用

1.1 方法是什么?

有c语言基础,可以将方法理解为c语言中的函数。

方法就是一段代码,方法可以实现程序中的特定功能。比如实现一个判断素数功能的方法,我们在需要的时候就不需要写这一份代码,而是直接调用这个方法去实现功能。

方法的意义:

  • 是能够模块化的组织代码
  • 做到代码被重复使用, 一份代码可以在多个位置使用
  • 让代码更好理解更简单.
  • 能直接调用而不用重复冗余地去写相同功能的代码

1.2 方法的定义

定义方式:
在这里插入图片描述

方法的基础概念:

  • 修饰符:现阶段直接用public static固定搭配。
  • 返回值类型是需要自己去确定的,需要返回什么样的数据类型就确定什么样的返回值类型,如果没有返回值,就必须写出void类型。
  • 方法名字:一般采取小驼峰的命名格式(代码规范)。
  • 参数列表:方法中没有参数的话,可以直接不写参数,但是如果有多个参数,参数与参数之间需要用逗号隔开。
  • 方法体: 也就是我们在方法内部实现功能的代码。
  • 在java中,方法不能像c语言一样,方法必须写在类当中。
  • 在java中,方法一样是不能嵌套定义的
  • 在java中,方法没有声明这一概念。

1.3 方法的执行过程

如图代码的执行流程:

在这里插入图片描述

注意:

  • 一个方法只有被调用的时候才会执行。
  • 方法可以重复调用。

1.4 形参与实参的关系(重点)

什么是实参:实参是java程序中传递给方法的值。

什么是形参:形参是java方法用来接收实参的变量,形参只是方法用来接收实参的一个临时变量,用来保存传递过来的值,也就是说形参是实参的一份临时拷贝。

public static int add(int x,int y){
      //x,y是形参。 
        return x+y;
    }
    
    public static void main(String[] args) {
        int a = 20;
        int b = 10;
        int rer = add(a,b);//a,b是实参。
    }

强调:形参与实参之间并没有直接的关系,仅仅只是实参的值拷贝到了形参中去而已,就算改变形参的值,也不会最终影响到实参。

例如

public class TestMethod {
 public static void main(String[] args) {
     
     int a = 10;
     int b = 20;
     System.out.println("main: a = " + a + " b = " + b);
     swap(a, b);
     System.out.println("main: a = " + a + " b = " + b);

 }
 public static void swap(int x, int y) {
        int tmp = x;
        x = y;
        y = tmp;
        System.out.println("swap: x = " + x + " y = " + y);
   }
}

运行结果:

在这里插入图片描述

可以看到,在swap函数交换之后,形参x和y的值发生了改变,但是main方法中a和b还是交换之前的值,即没有交换成功。

原因分析:(重点)

实参a和b是main方法中的两个变量,其空间在main方法的栈(一块特殊的内存空间)中,而形参x和y是swap方法中的两个变量,x和y的空间在swap方法运行时的栈中,两者在不同的存储空间中,实参a和b 与 形参x和y是两个没有任何关联性的变量。
swap方法调用时,只是将实参a和b中的值拷贝了一份传递给了形参x和y,因此对形参x和y操作不会对实参a和b产生任何影响。这也被称为 传值调用。

2.方法的重载

2.1方法重载的概念

多个方法名字相同,但是参数列表不同,则称为这几种方法被重载了

代码示例:

public class TestMethod {
 public static void main(String[] args) {
     
    int ret1 = add(1,2);
            // 调用add(int, int)
    double ret2 = add(1.5, 2.5);
            // 调用add(double, double)
    double ret3 = add(1.5, 2.5, 3.5);
            // 调用add(double, double, double)
    System.out.println(ret1+" "+ret2+" "+ret3);
 }
 public static int add(int x, int y) {
     
     return x + y;
 }
 public static double add(double x, double y) {
     
     return x + y;
 }
 public static double add(double x, double y, double z) {
     return x + y + z;
 }
}

    

运行结果:

在这里插入图片描述

重载的注意事项:

  • 方法名必须相同。

    也就是说,方法名相同是重载的首要前提条件,只有方法名相同的方法才能算是方法重载的使用

  • 参数列表必须不同。(参数的个数不同、参数的类型不同、类型的次序必须不同)

    方法的区别主要在于参数列表的不同,也是区别方法重载中不同方法的重要指标之一。

    代码示例:

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

    报错信息:

在这里插入图片描述

在这里插入图片描述

  • 与返回值类型是否相同无关

总结:

也就是说方法重载的唯一重点注意地方就在于参数列表,参数的个数要不同,参数的类型不同,类型的次序不同,三个不同满足一个即可实现方法的重载。

2.2方法的签名

方法可以实现重载,而变量却不行,原因就在于方法的签名之上。方法的签名让重载方法得以被虚拟机系统利用。

如何找到方法的签名呢。

我们用以下代码测试:

public class TestMethod {
 public static void main(String[] args) {
     
    int ret1 = add(1,2);
            // 调用add(int, int)
    double ret2 = add(1.5, 2.5);
            // 调用add(double, double)
    double ret3 = add(1.5, 2.5, 3.5);
            // 调用add(double, double, double)
    System.out.println(ret1+" "+ret2+" "+ret3);
 }
 public static int add(int x, int y) {
     
     return x + y;
 }
 public static double add(double x, double y) {
     
     return x + y;
 }
 public static double add(double x, double y, double z) {
     return x + y + z;
 }
}

  1. 先编译一下已经有重载方法 的idea的代码。

  2. 然后进入该代码所在的文件,进入out文件夹,找到字节码文件(后缀为.class)

    在该文件夹里面,按住shift+右键,即可出现以下场景:

在这里插入图片描述

  1. 然后选择“在此处打开powershell窗口”

    进入powershell窗口

在这里插入图片描述

  1. 然后输入 java -v (.class文件名)

    即可出现java的编译代码情况:

在这里插入图片描述

  1. 方法签名如下:

    在这里插入图片描述

    我们可以明显的看到,重载的方法拥有着不同的方法签名。

    签名的具体命名方式:方法全路径名+参数列表+返回值类型。

3.递归

3.1递归思想

递归思想在数学和编程中非常有用,因为有些时候,我们遇到的问题直接并不好解决,但是发现将原问题拆分成其子问题之后,子问题与原问题有相同的解法,等子问题解决之后,原问题就迎刃而解了。大问题化小问题的思想模式。

3.2递归概念

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

递归的必要条件:

  1. 将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同
  2. 递归出口

3.3递归代码练习

求n 的阶乘

public static int factorial(int n){
        if(n==1){
            return 1;
        }
        else{
            return n*factorial(n-1);
        }
    }

代码分析:

通过自身调用自身来解决这个问题。这个递归的出口为n==1,也就是说,一个n的阶乘都是从n乘到1,所以到了1时,就应该终止运算。如果不是1,就继续运算n到2之间,也就是n*factorial(n-1)。

总结

方法其实与c语言的函数几乎没有区别,但是要注意java当中有方法的重载,而c语言却没有,这是一个比较巨大的差异,需要注意。

通过本章学习我们应该能回答出以下问题:

方法是什么?

方法的形参与实参之间是什么关系?

讲一下方法的重载?

掌握递归思想,可以用递归思想解决一部分算法题目。

感谢阅读。

与君共勉!

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小连~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值