# 方法

# 一、问题引入

public static void main(String[] args) {
    int sum = 0;
    for(int i = 1; i <= 10; i++) {
        sum += i;
    }
    System.out.println(sum);
    ...
    ...
    ...
    sum = 0;
    for(int i = 1; i <= 20; i++) {
        sum += i;
    }
    System.out.println(sum);
    ...
    ...
    ...    
    sum = 0;
    for(int i = 1; i <= 100; i++) {
        sum += i;
    }
    System.out.println(sum);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

上面的程序中,多次用到了1+2+3+...+n这个功能,每次实现都要重复的写这部分代码,这样程序会变得很臃肿,可读性也非常差。

为了解决代码重复编写的问题,我们可以将1+2+3+...+n这个功能抽取出来,提取出来放在一个{}中,并为这段代码起个名字,每次使用时,只要通过这个名字来使用就可以了。

上述过程中,所提取出来的代码可以被看作是程序中定义的一个方法,程序在需要发使用时调用该方法即可。

# 二、方法定义

# 2.1、什么是方法

简单的说:方法就是完成特定功能的代码块(代码片段)

在很多语言里面都有函数的定义,函数在Java中被称为方法

# 2.2、如何定义方法

修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2) {
	函数体;
	return 返回值;
}
1
2
3
4

修饰符比较多,后面会详细介绍。目前统一使用public static

方法名,一个名字,为了方便我们调用方法,要符合标识符的命名规范,见名知意

参数类型,限定调用方法时传入参数的数据类型

参数名,接收调用方法时传入的参数,要符合标识符的命名规范,见名知意

方法体,完成功能的代码

return,结束方法以及返回方法指定类型的值

返回值类型,用于限定返回值的数据类型。如果没有返回值,返回值类型为void,此时return语句有如下两种写法:

  • return;
  • 可以不写return语句

返回值,程序被return带回的结果,返回给调用者

public class MyTest1 {
    //定义方法
    //求两个数的和
    public static int sum(int a, int b) {
        //int sum = a + b;
        //return sum;
        retun a + b;
    }

    //定义方法
    //求1+2+3+...+n
    public static int sumn(int n) {
        int sum = 0;
        for(int i = 1; i <= n; i++) {
            sum += i;
        }
        return sum;
    }

    //定义方法
    //输出m行,每行打印n个*
    //没有返回值,返回值类型为void
    public static void printStar(int m, int n) {
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
        //没有返回值,可以不写return语句
        //return;
    }
    
    public static void main(String[] args) {
        //方法调用
        //打印5行,每行打印8个*
        printStar(5, 8);
        
        //方法调用
        //求10和5的和
        int s = sum(10, 5);
        System.out.println("10 + 5 = " + s);
        
        //方法调用
        //求1+2+3+..+10
        int s1 = sumn(10);
        System.out.println("1 + 2 + 3 + ... + 10 = " + s);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

# 三、方法重载

同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。

特点:

  • 与返回值类型无关,只看方法名和参数列表
  • 在调用时,JVM通过参数列表的不同来区分同名方法
public class MyTest1 {
    //定义方法
    //求两个数的和
    public static int sum(int a, int b) {
        //int sum = a + b;
        //return sum;
        retun a + b;
    }

    //定义方法
    //求三个数的和
    public static int sum(int a, int b, int c) {
        //int sum = a + b;
        //return sum;
        retun a + b + c;
    }
    
    public static void main(String[] args) {
        //方法调用,求两个数的和
		System.out.println(sum(1, 2));
        //方法调用,求三个数的和
        System.out.println(sum(1, 2, 3));
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 四、递归

定义:方法调用方法本身

注意:要有明确的退出条件

/*
	斐波那契数列 1, 1, 2, 3, 5
	f(n) = f(n - 1) + f(n - 2)
	f(1) = 1
	f(2) = 1
	
	求斐波那契数列第n个数的值
*/
public class MyTest2 {
    public static int f(int n) {
        if(n == 1) {
            return 1;
        }
        
        if(n == 2) {
            return 1;
        }
        
        return f(n - 1) + f(n - 2);
    }
    
    public static void main(String[] args) {
        int num = f(5);
        System.out.println(num);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
上次更新: 2024/4/13