十三、方法(声明与调用)

1 声明方法

1.1 方法

方法(Method)是 Java中一个命名的代码块,我们一直在使用的 main() 就是一个方法。这个代码块也称为函数

方法通常是为完成一定的功能,将程序中特定的代码块组合在一起构成的。

其主要的好处体现在两个方面:一个是可以重用,另一个是使程序结构更加清晰。

语法:

[修饰符] 返回值数据类型 方法名([参数列表]){
    方法体;
}

参数列表为可选部分;Java 中的方法名一般使用小驼峰命名法。

方法名” 用于唯一标识一个方法。“参数列表” 相当于U盘的 “输入信号” ,“返回值” 相当于U盘的 “输出信号” 。USB接口上可以插各种设备,比如U盘、摄像头、麦克风等,这些设备需要不同的输入信号,也会给出各不相同的输出信号。方法也一样。“参数列表” 严格规定了输入数据的数据类型,而 “返回值类型” 严格规定了输出数据的数据类型。“方法体” 是处理输入信息,得到输出信息的工作流程。

static 的功能,需要等到学过类的知识后,才能理解。

1.2 方法声明案例

让我们完成上一节中,我们希望使用的 “代码模块” :遍历姓名数组,找对应索引值,找不到就返回 -1

static int getNameIndex(String[] names, String name, int indexOfNullPos){
    for (int i = 0; i < indexOfNullPos; i++){
        if (names[i].equals(name)){
            return i;
        }
    }
    return -1;
}

1.2.1 修饰符 static

修饰符用于规定方法的各种特征,例如 static 就代表这是一个静态方法,这些内容我们将在后面进行介绍。

1.2.2 返回值类型 int

就像我们写这个方法,是为了找到一个 int 类型的索引值一样,很多时候,程序员写方法,是为了从方法中得到一个结果值。这个值被称为“返回值”,它的数据类型被称为“返回值类型”。

返回值究竟是什么类型的,需要在方法声明时指出。

对于不需要有返回值的函数,返回值类型为 void

1.2.3 方法名 getNameIndex

就像变量需要有变量名一样,方法也需要有方法名,用于唯一标识一个方法。

方法名也是标识符,必须符合标识符命名规则。

1.2.4 参数列表 getNameIndex

参数用于接收外界传入的信息,可以是一个或多个,也可以一个也没有。但无论是否需要传入信息,括号是必不可少的。

信息从外界传入方法后,在方法中就不能使用它们原本的名字了,而是使用参数列表中的对应名字替代。正因如此,方法才能拥有极高的泛用性。

因为参数列表中的变量仅仅是给实际传入变量规定一个新名字,并不实际存在,所以这些参数被称为 “形参” 。同理,实际存在的变量,也就是被传入方法的那些参数,被称为 “实参”

1.2.5 方法体 {}

写在 {} 中的方法体,是调用方法时,将实际执行的代码。

1.2.6 return 语句

调用方法时,主动调用的一方被称为 “主调方法” ,被调用的一方被称为 “被调方法” ,发生函数调用时,“主调方法”将程序运行控制权交给“被调方法”。

return 的意思是 “交还、归还、返回”,即 “将程序控制权交还给主调函数”的意思,这将导致当前方法执行结束,程序从方式函数调用的地方,继续执行主调方法。简单地说:return 的作用是结束当前方法的执行。

对于有返回值的方法,一个方法中有那么多数据,究竟哪一个才是方法想输出的数据呢?这时候,就需要 return 语句来指明要返回的值了。这是 return 的另一个用途,在结束方法的同时,指明一个返回值。

返回值最多只能有一个,如果需要多个返回值,应该使用数组等数据结构。

2 调用方法

上面的代码,仅仅是声明了一个方法,接下来介绍如何使用一个方法,即 “方法的调用”

import java.util.Arrays;
import java.util.Objects;
import java.util.Scanner;

public class Hello {
    static int getNameIndex(String[] names, String name, int indexOfNullPos){
        for (int i = 0; i < indexOfNullPos; i++){
            if (names[i].equals(name)){
                return i;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        // 两个数组,用于记录姓名与电话号码
        String[] names = new String[10];
        String[] phoneNumbers = new String[10];
        // 最小的暂未存入数据的数组索引值,用于确定下一个联系人信息存入位置
        int indexOfNullPos = 0;

        // 用于接收用户输入
        Scanner input = new Scanner(System.in);
        // 用于接收用户选择的功能序号
        int indexOfFunction = -1;
        // 程序主循环
        while (true) {
            // 显示主界面
            System.out.println("-----简易通讯录-----");
            System.out.println("1:添加联系人");
            System.out.println("2:查询联系人电话");
            System.out.println("0:退出程序");
            System.out.println("------------------");

            // 接收用户的选择
            if (input.hasNextInt()) {
                indexOfFunction = input.nextInt();
                input.nextLine();
                if (indexOfFunction < 0) {
                    System.out.println("请输入正确的功能序号!!!");
                    continue;
                }
            } else {
                input.nextLine();
                System.out.println("请输入正确的功能序号!!!");
                continue;
            }

            if (indexOfFunction == 1) {
                // 添加联系人功能
                if (indexOfNullPos == names.length){
                    System.out.println("通讯录已满,无法存入新数据!");
                    continue;
                }
                System.out.println("请输入新联系人姓名:");
                String newName = input.nextLine();
                if (getNameIndex(names,newName,indexOfNullPos) != -1){
                    System.out.println("此联系人已存在!");
                    continue;
                }
                names[indexOfNullPos] = newName;
                System.out.println("请输入联系人电话号码:");
                phoneNumbers[indexOfNullPos] = input.nextLine();
                indexOfNullPos++;
            } else if (indexOfFunction == 2) {
                // 查询联系人功能
                System.out.println("请输入要查找的联系人姓名:");
                String tempName = input.nextLine();
                int tempIndex = getNameIndex(names,tempName,indexOfNullPos);
                for (; tempIndex < indexOfNullPos; tempIndex++){
                    if (names[tempIndex].equals(tempName)){
                        System.out.println("这位联系人的电话号码是:" + phoneNumbers[tempIndex]);
                        break;
                    }
                }
                if (tempIndex == names.length){
                    System.out.println("未保存过此联系人信息!!!");
                    continue;
                }
            } else if (indexOfFunction == 0) {
                // 退出程序
                break;
            } else {
                // 此序号没有对应功能,请重新输入
                System.out.println("请输入正确的功能序号!!!");
                continue;
            }
        }
    }
}