Day04_方法

一. 方法的概念

在这里插入图片描述

概念:实现特定功能的一段代码,可以反复使用

【注】: 方法的本质是一种行为

二. 方法的定义

定义语法:

public static void 方法名称() {// 方法主体
}

经验: 将需要在多个位置重复使用的一组代码,定义在方法内部。

定义位置:

方法定义在类的内部,与main方法并列。

// 位置1
public class TestDefinitionFunction {
    // 位置2
    public static void main(String[] args) {
        // 位置3
    }
    // 位置4
}
// 位置5

正确位置: 位置2、位置4

【例】:

public class TestFunction {
    public static void main(String[] args) {
        System.out.println("床前明月光");
        printSign();
        System.out.println("疑是地上霜");
        printSign();
        System.out.println("举头望明月");
        printSign();
        System.out.println("低头思故乡");
        printSign();
    }
    // 定义:打印10个分割符的函数
    public static void printSign() {
        for (int i = 1; i <= 10; i++) {
            System.out.print("-");
        }
        System.out.println();
    }
}

【注】: 调用方法时,会优先执行方法内部的代码,结束后,返回到方法调用处,继续向下执行。

【注】: 一个类中可以有多个方法,方法之间属于并列关系,不可嵌套。

经验: 一个方法只做一件事。

三. 方法的组成

方法的参数:

参数的概念:

调用方法时,所传入的数据。

多数情况下,方法与调用者之间需要数据的交互;调用者必须提供数据,才能使方法完成相应的功能。

比如,取款时需要提供取款金额。

方法的参数可以让代码功能更灵活,普适性、可维护性更高。

形参与实参:

定义语法:

public static void 方法名称( 形式参数 ) {
 	// 方法主体 
}

调用语法:

方法名称( 实际参数 );

【注】: “形参”等价于“局部变量的声明”

【注】: “实参”等价于“局部变量的赋值”

【注】: 参数可以有单个,也可有多个,也可以没有参数。

返回值与返回类型:

返回的概念:

方法执行后的返回结果。

  • 方法 —— 行为
  • 返回值 —— 行为的目的

方法执行后,一些情况下无需返回结果;另一些情况下必须返回结果。

定义语法:

public static 返回值类型 方法名称 ( 形式参数 ) {// 方法主体return 返回值;  
}

调用语法:

变量 = 方法名称 ( );	// 变量类型与返回值类型一致
返回类型:

返回类型需要与返回值的数据类型相匹配

【注】: 一个方法只能有一个返回值,当方法存在分支结构时,必须保证每一条分支都具有正确的返回值。

void :

如果方法行为本身就是使用者要达到的目的,则使用void。

【注】: 若方法有返回值,一定要有东西来"消化"该返回值。 方法的返回值有两种消化方式

  1. 通过变量的存储来消化
  2. 通过参数来消化返回值
public static void 方法名称() {// 方法主体
}
return 关键字 :
  • 应用在具有返回值类型的方法中:
    • ​ return value; // 表示结束当前方法,并伴有返回值,返回到方法调用处。
  • 应用在没有返回值类型(void) 的方法中:
    • ​ return; // 表示结束当前方法,直接返回到方法调用处。

四. 方法的好处

好处:

  • 减少代码冗余
  • 提高复用性
  • 提高可读性
  • 提高可维护性
  • 方便分工合作

五. 方法的调用

多级调用

public class InvokeTest {
    public static void main(String[] args) {
        m1();
    }
    
    public static void m1() {
        System.out.println("m1()/start");
        m2();
        System.out.println("m1()/end");
    }
    public static void m2() {
        System.out.println("m2()/start");
        System.out.println("m2()/end");
    }
}

结果为:

m1()/start
m2()/start
m2()/end
m1()/end

无穷递归

当方法调用自己时,没有正确的出口条件,则产生无穷递归。

public class InvokeTest {
    public static void main(String[] args) {
        m1();
    }
    
    public static void m1() {
        System.out.println("m1()/start");
        m1();
        System.out.println("m1()/end");
    }
}

结果为:

m1()/start
m1()/start
m1()/start
m1()/start

Exception in thread “main” java.lang.StackOverflowError

内存溢出异常

六. 递归

递归的概念:

解决具有既定规律的问题时,在方法内部再次调用自身方法的一种编程方式。

何时使用递归:

当要解决的问题可以拆分成若干个小问题,大小问题的解决方式相同,方法中自己调用自己。

使用循环解决的常规问题,都可以替换为递归解决。

如何正确使用递归:

设置有效的出口条件,可以让调用链上的每个方法都可以正确返回,避免无穷递归。

【例】:

// 循环阶乘
public static int factorial_loop(int n) {
    int sum = 1;
    for (int i = 1; i <= n; i++) {
        sum *= i;
    }
    return sum;
}
// 递归阶乘
public static int factorial_recursion(int n) {
    if (n == 0) {
        return 1;
    }
    return n * factorial_recursion(n-1);
}
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页