# 方法概述
方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集
- 注意:
- 方法必须先创建才可以使用,该过程成为方法定义
- 方法创建后并不是直接可以运行的,需要手动使用后,才执行,该过程成为方法调用
# 定义和调用
# 无参数方法定义和调用
定义格式:
public static void 方法名 ( ) {
// 方法体;
}
方法名();
注意:
方法必须先定义,后调用,否则程序将报错总结:每个方法在被调用执行的时候,都会进入栈内存,并且拥有自己独立的内存空间,方法内部代码调用完毕之后,会从栈内存中弹栈消失。
# 带参数方法定义和调用
定义格式:
参数:由数据类型和变量名组成 - 数据类型 变量名
参数范例:int a
public static void 方法名 (参数1, 参数2, 参数3...) {
方法体;
}
注意:
方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序将报错方法定义时,多个参数之间使用逗号( ,)分隔
方法调用时,参数的数量与类型必须与方法定义中的设置相匹配,否则程序将报错
# 形参和实参
形参:方法定义中的参数
等同于变量定义格式,例如:int number实参:方法调用中的参数
等同于使用变量或常量,例如: 10 number
# 带返回值方法的定义和调用
定义格式
public static 数据类型 方法名 ( 参数 ) {
return 数据 ;
}
- 注意:
- 方法定义时 return 后面的返回值与方法定义上的数据类型要匹配,否则程序将报错
- 注意:
调用格式
方法名 ( 参数 ) ;
数据类型 变量名 = 方法名 ( 参数 ) ;
范例
isEvenNumber ( 5 ) ;
boolean flag = isEvenNumber ( 5 );
- 注意:
- 方法的返回值通常会使用变量接收,否则该返回值将无意义
- 注意:
需求:设计一个方法可以获取两个数的较大值,数据来自于参数
代码:
public class MethodTest {
public static void main(String[] args) {
// 在 main () 方法中调用定义好的方法并使用变量保存
int result = getMax(10,20);
System.out.println(result);
// 在 main () 方法中调用定义好的方法并直接打印结果
System.out.println(getMax(10,20));
}
// 定义一个方法,用于获取两个数字中的较大数
public static int getMax(int a, int b) {
if(a > b) {
return a;
} else {
return b;
}
}
}
# 方法的注意事项
# 注意事项
方法不能嵌套定义
示例代码:
public class MethodDemo {
public static void main(String[] args) {
}
public static void methodOne() {
public static void methodTwo() {
// 这里会引发编译错误!!!
}
}
}
void 表示无返回值,可以省略 return,也可以单独的书写 return,后面不加数据
示例代码:
public class MethodDemo {
public static void main(String[] args) {
}
public static void methodTwo() {
//return 100; 编译错误,因为没有具体返回值类型
return;
//System.out.println (100); return 语句后面不能跟数据或代码
}
}
# 通用格式
格式:
public static 返回值类型 方法名(参数) {
方法体;
return 数据 ;
}
解释:
public static 修饰符,目前先记住这个格式
返回值类型 方法操作完毕之后返回的数据的数据类型
如果方法操作完毕,没有数据返回,这里写void,而且方法体中一般不写return
方法名 调用方法时候使用的标识
参数 由数据类型和变量名组成,多个参数之间用逗号隔开
方法体 完成功能的代码块
return 如果方法操作完毕,有数据返回,用于把数据返回给调用者
定义方法时,要做到两个明确
- 明确返回值类型:主要是明确方法操作完毕之后是否有数据返回,如果没有,写 void;如果有,写对应的数据类型
- 明确参数:主要是明确参数的类型和数量
调用方法时的注意:
- void 类型的方法,直接调用即可
- 非 void 类型的方法,推荐用变量接收调用
# 方法重载
# 方法重载
方法重载概念
方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载
- 多个方法在同一个类中
- 多个方法具有相同的方法名
- 多个方法的参数不相同,类型不同或者数量不同
注意:
- 重载仅对应方法的定义,与方法的调用无关,调用方式参照标准格式
- 重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关,换句话说不能通过返回值来判定两个方法是否相互构成重载
正确范例:
public class MethodDemo {
public static void fn(int a) {
// 方法体
}
public static int fn(double a) {
// 方法体
}
}
public class MethodDemo {
public static float fn(int a) {
// 方法体
}
public static int fn(int a , int b) {
// 方法体
}
}
错误范例:
public class MethodDemo {
public static void fn(int a) {
// 方法体
}
public static int fn(int a) { /* 错误原因:重载与返回值无关 */
// 方法体
}
}
public class MethodDemo01 {
public static void fn(int a) {
// 方法体
}
}
public class MethodDemo02 {
public static int fn(double a) { /* 错误原因:这是两个类的两个 fn 方法 */
// 方法体
}
}
# 方法重载练习
需求:使用方法重载的思想,设计比较两个整数是否相同的方法,兼容全整数类型(byte,short,int,long)
思路:
- ①定义比较两个数字的是否相同的方法 compare () 方法,参数选择两个 int 型参数
- ②定义对应的重载方法,变更对应的参数类型,参数变更为两个 long 型参数
- ③定义所有的重载方法,两个 byte 类型与两个 short 类型参数
- ④完成方法的调用,测试运行结果
代码:
public class MethodTest {
public static void main(String[] args) {
// 调用方法
System.out.println(compare(10, 20));
System.out.println(compare((byte) 10, (byte) 20));
System.out.println(compare((short) 10, (short) 20));
System.out.println(compare(10L, 20L));
}
//int
public static boolean compare(int a, int b) {
System.out.println("int");
return a == b;
}
//byte
public static boolean compare(byte a, byte b) {
System.out.println("byte");
return a == b;
}
//short
public static boolean compare(short a, short b) {
System.out.println("short");
return a == b;
}
}
# 方法的参数传递
# 基本类型
测试代码:
public class ArgsDemo01 {
public static void main(String[] args) {
int number = 100;
System.out.println("调用change方法前:" + number);
change(number);
System.out.println("调用change方法后:" + number);
}
public static void change(int number) {
number = 200;
}
}
结论:
- 形参不影响实参
# 方法参数传递引用类型
测试代码:
public class ArgsDemo02 {
public static void main(String[] args) {
int[] arr = {10, 20, 30};
System.out.println("调用change方法前:" + arr[1]);
change(arr);
System.out.println("调用change方法后:" + arr[1]);
}
public static void change(int[] arr) {
arr[1] = 200;
}
}
结论:
- 对于引用类型的参数,形式参数的改变,影响实际参数的值
# 数组最大值
需求:设计一个方法用于获取数组中元素的最大值
思路:
- ①定义一个数组,用静态初始化完成数组元素初始化
- ②定义一个方法,用来获取数组中的最大值,最值的认知和讲解我们在数组中已经讲解过了
- ③调用获取最大值方法,用变量接收返回结果
- ④把结果输出在控制台
代码:
public class MethodTest02 {
public static void main(String[] args) {
int[] arr = {12, 45, 98, 73, 60};
int number = getMax(arr);
System.out.println("number:" + number);
}
public static int getMax(int[] arr) {
int max = arr[0];
for(int x=1; x<arr.length; x++) {
if(arr[x] > max) {
max = arr[x];
}
}
return max;
}
}
# Debug 模式
是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序。
# Debug 模式操作流程
如何加断点
- 选择要设置断点的代码行,在行号的区域后面单击鼠标左键即可
如何运行加了断点的程序
- 在代码区域右键 Debug 执行
点哪里
- 点 Step Into (F7) 这个箭头,也可以直接按 F7
如何删除断点
- 选择要删除的断点,单击鼠标左键即可
- 如果是多个断点,可以每一个再点击一次。也可以一次性全部删除
# 基础练习
# 减肥计划 if 版本
public class Test01 { | |
public static void main(String[] args) { | |
Scanner sc = new Scanner(System.in); | |
System.out.println("请输入一个星期数:"); | |
int week = sc.nextInt(); | |
if (week < 1 || week > 7) { | |
System.out.println("你输入的星期数有误"); | |
} else if (week == 1) { | |
System.out.println("跑步"); | |
} else if (week == 2) { | |
System.out.println("游泳"); | |
} else if (week == 3) { | |
System.out.println("慢走"); | |
} else if (week == 4) { | |
System.out.println("动感单车"); | |
} else if (week == 5) { | |
System.out.println("拳击"); | |
} else if (week == 6) { | |
System.out.println("爬山"); | |
} else { | |
System.out.println("好好吃一顿"); | |
} | |
} | |
} |
# 减肥计划 switch 版本
导包: | |
1:手动导包 import java.util.Scanner; | |
2:快捷键导包 Alt+Enter | |
3:自动导包 | |
public class Test02 { | |
public static void main(String[] args) { | |
// 键盘录入一个星期数,用一个变量接收 | |
Scanner sc = new Scanner(System.in); | |
System.out.println("请输入一个星期数:"); | |
int week = sc.nextInt(); | |
// 对星期数进行判断,这里用 switch 语句实现 | |
switch (week) { | |
case 1: | |
System.out.println("跑步"); | |
break; | |
case 2: | |
System.out.println("游泳"); | |
break; | |
case 3: | |
System.out.println("慢走"); | |
break; | |
case 4: | |
System.out.println("动感单车"); | |
break; | |
case 5: | |
System.out.println("拳击"); | |
break; | |
case 6: | |
System.out.println("爬山"); | |
break; | |
case 7: | |
System.out.println("好好吃一顿"); | |
break; | |
default: | |
System.out.println("你输入的星期数有误"); | |
} | |
} | |
} |
# 不死神兔
有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,
假如兔子都不死,问第二十个月的兔子对数为多少?
public class Test04 { | |
public static void main(String[] args) { | |
int[] arr = new int[20]; | |
arr[0] = 1; | |
arr[1] = 1; | |
for(int x=2; x<arr.length; x++) { | |
arr[x] = arr[x-2] + arr[x-1]; | |
} | |
System.out.println("第二十个月兔子的对数是:" + arr[19]); | |
} | |
} |
# 百钱白鸡
我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。
百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
/* | |
思路: | |
1: 第 1 层循环,用于表示鸡翁的范围,初始化表达式的变量定义为 x=0,判断条件是 x<=20 | |
2: 第 2 层循环,用于表示鸡母的范围,初始化表达式的变量定义为 y=0,判断条件是 y<=33 | |
3: 这个时候,用于表示鸡雏的变量 z = 100 – x – y | |
4: 判断表达式 z%3==0 和表达式 5*x + 3*y + z/3 = 100 是否同时成立,如果成立,输出对应的 x,y,z 的值,就是对应的鸡翁,鸡母,鸡雏的值 | |
*/ | |
public class Test05 { | |
public static void main(String[] args) { | |
for(int x=0; x<=20; x++) { | |
for(int y=0; y<=33; y++) { | |
int z = 100 - x - y | |
if(z%3==0 && 5*x+3*y+z/3==100) { | |
System.out.println(x+","+y+","+z); | |
} | |
} | |
} | |
} | |
} |
# 查找元素在数组中出现的索引位置
已知一个数组 arr = {19, 28, 37, 46, 50}; 键盘录入一个数据,查找该数据在数组中的索引。
并在控制台输出找到的索引值。如果没有查找到,则输出 - 1
/* | |
思路: | |
1: 定义一个数组,用静态初始化完成数组元素的初始化 | |
2: 键盘录入要查找的数据,用一个变量接收 | |
3: 定义一个索引变量,初始值为 - 1 | |
4: 遍历数组,获取到数组中的每一个元素 | |
5: 拿键盘录入的数据和数组中的每一个元素进行比较,如果值相同,就把该值对应的索引赋值给索引变量,并结束循环 | |
6: 输出索引变量 | |
*/ | |
public class Test08 { | |
public static void main(String[] args) { | |
int[] arr = {19, 28, 37, 46, 50}; | |
Scanner sc = new Scanner(System.in); | |
System.out.println("请输入要查找的数据:"); | |
int number = sc.nextInt(); | |
int index = getIndex(arr, number); | |
System.out.println("index: " + index); | |
} | |
public static int getIndex(int[] arr, int number) { | |
int index = -1; | |
for(int x=0; x<arr.length; x++) { | |
if(arr[x] == number) { | |
index = x; | |
break; | |
} | |
} | |
return index; | |
} | |
} |
# 数组元素反转
已知一个数组 arr = {19, 28, 37, 46, 50}; 用程序实现把数组中的元素值交换,
交换后的数组 arr = {50, 46, 37, 28, 19}; 并在控制台输出交换后的数组元素。
/* | |
思路: | |
1: 定义一个数组,用静态初始化完成数组元素的初始化 | |
2: 循环遍历数组,这一次初始化语句定义两个索引变量,判断条件是开始索引小于等于结束索引 | |
3: 变量交换 | |
4: 遍历数组 | |
*/ | |
public class Test09 { | |
public static void main(String[] args) { | |
int[] arr = {19, 28, 37, 46, 50}; | |
reverse(arr); | |
printArray(arr); | |
} | |
public static void reverse(int[] arr) { | |
for (int start = 0, end = arr.length - 1; start <= end; start++, end--) { | |
int temp = arr[start]; | |
arr[start] = arr[end]; | |
arr[end] = temp; | |
} | |
} | |
public static void printArray(int[] arr) { | |
System.out.print("["); | |
for (int x = 0; x < arr.length; x++) { | |
if (x == arr.length - 1) { | |
System.out.print(arr[x]); | |
} else { | |
System.out.print(arr[x] + ", "); | |
} | |
} | |
System.out.println("]"); | |
} | |
} |