十三、方法(声明与调用)
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;
}
}
}
}