一、引入

我们先看一个需求:在每一行文本后,用30个=做分隔线。

如果不使用函数,代码会这样写:
System.out.println("好好学习");
for(int i=1;i<=30;i++){
    System.out.print("=");
}
System.out.println();

System.out.println("天天向上");
for(int i=1;i<=30;i++){
    System.out.print("=");
}
System.out.println();

System.out.println("good good study");
for(int i=1;i<=30;i++){
    System.out.print("=");
}
System.out.println();

System.out.println("day day up");
这种写法存在两个明显问题:

1. 重复代码多:打印分隔线的循环逻辑被复制了4次,代码显得冗余。

2. 维护成本高:如果要把分隔线改成20个=,需要修改每一处循环,容易漏改。

为了解决这类重复代码的问题,我们可以把重复的逻辑封装成一个独立的代码块,给它起一个名字,之后只需要通过这个名字就能重复调用这段逻辑,这就是函数的核心思想。

二、函数到底是什么?

简单说,函数就是给一段重复用的代码起个名字,打包起来,想用就喊它的名字。

1. 函数的组成(核心3要素)

• 函数名:就是给这段代码起的名字,比如printLine,见名知意,按驼峰命名法写就行(比如printHello,第一个单词小写,后面单词首字母大写)

• 参数:调用的时候可以传给函数的数据,比如想打印20个等号还是30个,就可以通过参数传进去

• 返回值:函数执行完,要不要给调用者返回一个结果,比如算加法的函数,最后要把和返回出来;如果只是打印东西,不用返回结果,就写void

2. 函数的定义格式(照着写就行)
public static 返回值类型 函数名(数据类型 参数1, 数据类型 参数2) {
    // 这里写函数要做的事(函数体)
    // 如果有返回值,最后要写return 结果;
}
举个例子,把笔记里的“打印一句话+30个等号”做成函数:
// 定义一个打印分隔线的函数,参数是要打印的文字
public static void printLine(String content) {
    System.out.println(content);
    for(int i=1; i<=30; i++){
        System.out.print("=");
    }
    System.out.println();
}
3. 函数写在哪里?

只能写在类里面,和main函数并列的位置,不能写在main函数里面!
public class Test {
    // 这里可以写函数(和main并列)
    public static void main(String[] args) {
        // main函数里写调用函数的代码
    }
    // 这里也可以写函数
}
三、怎么用函数?

1. 普通调用(没有参数、没有返回值)
// 定义
public static void sayHello() {
    System.out.println("Hello!");
}

// 调用(在main里)
public static void main(String[] args) {
    sayHello(); // 直接写函数名+括号就行,想调用几次就写几次
}
2. 带参数调用
// 定义(带参数)
public static void printLine(String content) {
    System.out.println(content);
    for(int i=1; i<=30; i++){
        System.out.print("=");
    }
    System.out.println();
}

// 调用(在main里)
public static void main(String[] args) {
    printLine("好好学习");
    printLine("天天向上");
}
注意:调用的时候传的参数(实参),个数、顺序、类型必须和定义时的参数(形参)完全一样!

3. 带返回值的调用
// 定义(有返回值)
public static int add(int a, int b) {
    return a + b; // 把计算结果返回
}

// 调用(在main里)
public static void main(String[] args) {
    // 方式1:用变量接住结果
    int sum = add(3,5);
    System.out.println(sum); // 输出8

    // 方式2:直接打印调用结果
    System.out.println(add(10,20)); // 输出30
}
注意:返回值类型不是void的函数,必须写return语句,而且返回的结果必须和定义的类型一致!
四、函数的作用

1. 减少代码重复,不用反复写一样的代码

2. 改起来方便,只需要改函数里的代码,所有调用的地方都会跟着变

3. 代码更清晰,一个函数只做一件事,别人看代码也更容易懂
五、补充:递归调用(了解就行)

递归就是函数自己调用自己,比如计算阶乘:
public static int jiecheng(int n) {
    if(n == 1 || n == 0) { // 必须设置出口,不然会无限调用,程序崩掉
        return 1;
    }
    return n * jiecheng(n-1); // 自己调用自己
}
实际开发里递归要慎用,很容易写出死循环,考试里常考阶乘、斐波那契数列这类题。
六、小总结

函数就是Java里的“代码打包工具”,核心就是定义(写好要做的事)+ 调用(用的时候喊名字),记住定义格式、参数和返回值的规则,多写几次就熟了。
 

更多推荐