说明

这是一个完善了但又不完善的笔记,或许以后会更新

可以参考但请务必超越

源文件


Tools


Typora
PicGo

方法的使用

1.方法的基本用法

1.1 什么是方法(method)

方法就是一个代码片段,类似于C语言中的”函数“

方法/函数:可以理解为一个功能,他是可以重复使用的。

很容易理解,就是自己写的一个功能,想用的时候就用一下。

之前写过阶乘和阶乘的相加,就可以用方法来写,和函数一样,可以使用方法递归,写出来就很简洁。

1.2 方法定义语法

在C语言中函数的定义很简单,和main函数一样。

Java中也一样

//方法定义
public static 方法返回值 方法名称([参数类型 形参...]){
    方法体代码;
    [return 返回值];
}

public static void main(String[] args) {
    //方法调用
    返回值变量 = 方法名称(实参...);
}

举个栗子

最简单的加法函数(方法)

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

public static void main(String[] args) {
    add(10, 20);
}

idea快捷方法注释

一般我们写方法的时候,都应该在使用文档注释,用来说明参数和返回值表示什么

idea提供了快捷输入方法注释的功能

输入/**然后回车Enter即可自动罗列参数和返回值

1.3 方法调用的执行过程

  • 定义方法的时候,不会执行方法的代码.。只有调用的时候才会执行。
  • 当方法被调用的时候,会将实参赋值给形参。
  • 参数传递完毕后,就会执行到方法体代码。
  • 当方法执行完毕之后(遇到 return 语句),就执行完毕,回到方法调用位置继续往下执行。
  • 一个方法可以被多次调用。

1.4 实参和形参(重要)

首先注意,实际上在Java中只有按值传递

也就是传值调用

匹配问题

整个函数在使用的过程当中实参和形参需要匹配

  1. 参数类型
  2. 参数数量
  3. 返回类型

就像买卖交易一定是等价的,不能我1分钱买一栋楼吧。

返回值

需要什么返回值,是要看我们方法的功能需要什么

如果返回类型是void,那就是没得返回

当我们直接打印方法返回值的时候

System.out.println(add(10, 20));

如果这个add函数他的返回值是void那肯定就出错了

链式调用

正常情况我们add函数的返回值应该是int

那么我们直接打印的时候也是支持给别处使用的。比如我们乘个2

System.out.println(add(10, 20)*2);

当然如果方法的返回值是void那肯定不行

交换数据的注意

在实参和形参里,如果我们想要写一个方法交换一组数据,在形参中交换,回头打印的还是实参的数据,没有交换

因为实参的变量是放在栈上的,而在Java里面是拿不到栈上的地址的。想要交换,只能把实参的变量放到堆上,而放到堆上的都是对象。现在没有讲对象所以根本没办法说。

等到类和对象章节,或者数组章节的时候,就可以再讲了。

1.5 方法的声明(没有)

C语言是有函数声明的,你要用一个函数你得告诉有这么个函数

Java直接就没有,要用的时候直接用就行

2.方法的重载

我们知道有很多参数类型

那么当一个函数同时需要兼容多种参数类型的时候,就可以使用方法重载

2.1 重载要解决的问题

还是加法函数

那么问题来了,如果我想要加一组double该怎么办?

前面实参和形参中说要匹配的问题

肯定没法运行的呀

那么我们开看一看一种做法,那就是再写一个方法

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

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

使用2种方法分开来计算,例如Go语言就是这么做的

那可太麻烦了,以后要更多种类型那不得写更多

而且Java认为addInt这样的名字不友好,不如直接就叫add

所以就有了重载:overload

2.2 使用重载

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

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

可以看到改变了返回值类型和参数类型,方法名没改

这样就可以使用了

2.3 重载的规则

说白了,就是方法名不改,添加新的参数类型

  • 方法名相同
  • 方法的参数不同(参数个数,参数类型)
  • 方法的返回值和其类型不影响重载(方法的返回值不做要求)

上面的参数,在Java中会自动识别并使用,原因是编译器对每一个方法都会给一个签名

_int _add(_int,_int)

_double _add(_double,_double)

这样来识别,那就可以分开了

重载中返回值和返回值类型的注意

这里有一点要特别注意

重载,和返回值以及返回值类型是没关系的,而是和参数类型相关

return什么都可以,返回值类型无论是int还是double,只要后面的参数类型不变,都不会构成重载

可以看到红框的参数类型int没变,其他的变了,报错

参数类型变成double,不报错了

3.方法的递归

也就是函数递归嘛

3.1 递归的概念

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

注意:必须要有一个趋近于终止的条件,否则就死循环了。

栈溢出

就很容易理解,函数一直调用自己没完没了

3.2 递归执行过程分析

使用递归的时候,我们一般推荐是这样的

  • 思考递归的时候:横向思考
  • 代码执行的时候:纵向执行

意思就是说,如果是非常难的递归,你代入一个数字,拿着数字和代码一个一个展开...那可太麻烦了,又长又容易出错

我们分析的时候,举个简单的栗子就能直接明白

举个栗子

public static int fac(int n) {
    if (n == 1) {
        return 1;
    }
    int tmp = n * fac(n - 1);
    return tmp;
}  

public static void main(String[] args) {
    System.out.println(fac(3));
}

简单画个图就明白了

栈帧

每个函数(方法),在调用的时候,都会开辟一个属于这个函数的内容,就是栈帧。

关于C语言的具体的内容,可以直接搜索或者查看我写的函数栈帧

关于Java,可能大概或许会在以后将,也比C语言简单一点吧...

广告位招租
最后修改:2021 年 10 月 25 日 05 : 39 PM
如果觉得我的文章对你有用,请喂饱我!(理直气壮)