1. 方法简介
1.1 概述
方法
(method),也叫函数
,是可以完成某些特定功能的代码块.
- 例如: 现实生活中, 拿牙刷, 挤牙膏, 刷上排牙, 刷下排牙, 漱口, 这些单独的动作合起来, 就完成了刷牙的动作.
- 又例如: 让我们获取数组10和20的最大值, 我们可以通过if语句或者三元运算符实现, 如果再让我们获取22和11之间的最大值,
我们还需要把刚才的逻辑代码在写一次. 这样做很繁琐. 针对于这种情况, 我们就可以把获取两个整数最大值的逻辑代码封装到方法中
, 当我们需要比较的时候,直接调用方法
就可以了. 这样做, 非常方便.
1.2 定义格式
修饰符 返回值的数据类型 方法名(参数类型 参数名1, 参数类型 参数名2....) { //这里可以写多个参数
//方法体;
return 具体的返回值; //加工好的饲料
}
public static void main(String[] args) {
}
1.3 格式解释
修饰符
: 目前记住这里是固定格式public static,后面会详细了解返回值的数据类型
: 用于限定返回值的数据类型的
.- 注意:
- 返回值的数据类型是int类型, 则说明该方法只能返回int类型的整数.
如果方法没有具体的返回值, 则返回值的数据类型要用void来修饰.
方法
名: 方便我们调用方法.参数类型
: 用于限定调用方法时传入的数据的数据类型
.- 例如: 参数类型是String类型, 说明我们调用方法时, 只能传入字符串.
参数名
: 用于接收调用方法时传入的数据的变量
.方法体
:完成特定功能的代码
.return 返回值
: 用来结束方法的, 并把返回值返回给调用者
.- 解释: 如果方法没有明确的返回值, 则return关键字可以省略不写.
1.4 注意事项
- 方法与方法之间是
平级关系
,不能嵌套定义
. - 方法必须
先创建才可以使用
, 该过程称为:方法定义
. - 方法自身不会直接运行, 而是需要我们
手动调用方法后, 它才会执行
, 该过程称为方法调用
. - 方法的功能
越单一越好
. - 定义方法的时候
写在参数列表中的参数
, 都是:形参
.形参
: 形容调用方法的时候, 需要传入什么类型的参数.
- 调用方法的时候,
传入的具体的值
(变量或者常量都可以), 叫实参
.实
参: 调用方法时,实际参与运算的数据
.
1.5 方法的好处
- 可以
提高代码的复用性
,方便我们维护程序
.- 即: 当一些代码被反复使用时,可以把它们提取出来,放到一个方法里,以方法的形式来使用这些代码。
2. 无参无返回值的方法
2.1 定义无参无返回值的方法
- 定义方法时, 要做到
三个明确
, 这样定义方法就会变得非常简单了:- 明确
方法名
, 即: 方法名要符合小驼峰命名法
, 且要见名知意, 方便我们调用. - 明确方法的
参数列表
. 即: 调用方法时, 我们需要给它(方法)什么数据
. - 明确方法的
返回值类型
, 即: 调用方法完毕后, 方法会返回给我们一个什么类型的数据
.
- 明确
- 具体格式
public static void 方法名() {
//方法体;
}
需求定义printHello()方法, 用来打印"Hello World!"字符串.
- 参考代码
public static void printHello() {
System.out.println("Hello World!);
}
2.2 调用无参无返回值的方法
- 格式
方法名()
;- 解释: 通过方法名();的形式, 可以直接根据方法名调用指定的方法.
2.3 方法调用图解
2.4 示例一: 打印10次HelloWorld
- 需求
- 定义方法printHelloWorld(), 打印10次HelloWorld!.
- 参考代码
- 略
2.5 示例二: 打印奇偶数
- 需求
- 定义方法isEvenNumber(), 在方法内部有一个int类型的变量num.
- 判断该变量值是否是偶数, 并打印具体的结果.
- 参考代码
- 略.
3. 有参无返回值的方法
有参无返回值
的方法的意思是: 调用方法时, 我们需要传入具体的参数, 但是方法执行完毕后, 并不会给我们返回具体的结果.- 具体定义格式
public static void 方法名(参数类型 参数名1, 参数类型 参数名2) { //这里可以写多个参数
//方法体;
}
- 具体调用格式
方法名(参数值1, 参数值2); //注意: 参数的个数, 以及对应的参数类型都要和定义方法的参数列表保持一致.
3.1 示例一: 定义求和方法
- 需求
- 定义方法getSum(), 接收两个int类型的整数.
- 在方法内部获取上述两个整数的和, 并直接打印.
- 参考代码
- 略.
- 图解略.
3.2 示例二: 判断奇偶数
- 需求
- 定义方法isEvenNumber(), 该方法接收一个int类型的整数num.
- 判断num是奇数还是偶数, 并打印结果.
- 参考代码
- 略.
3.3 实例三: 获取最大值
- 需求
- 定义方法getMax(), 该方法接收两个整数.
- 通过该方法, 获取两个整数的最大值, 并打印.
- 参考代码
- 略.
4. 无参有返回值的方法
无参有返回值
的方法的意思是: 调用方法时, 我们不需要传入具体的参数, 但是方法执行完毕后, 会给我们返回具体的结果.- 具体定义格式
public static 返回值的数据类型 方法名() {
//方法体;
return 具体的返回值;
}
- 具体调用格式
//直接调用, 无意义.
方法名();
//输出调用
System.out.println(方法名());
//赋值调用, 实际开发中推荐使用.
数据类型 变量名 = 方法名();
4.1 示例一: 定义求和方法
- 需求
- 定义方法getSum(), 该方法内部有两个int类型的整数.
- 获取上述两个整数的和, 并返回.
- 在main方法中调用getSum()方法, 并打印结果.
- 参考代码
- 略.
- 图解略.
4.2 示例二: 判断奇偶数
- 需求
- 定义方法isEvenNumber(), 该方法内部有一个整数num.
- 判断num是奇数还是偶数, 并返回结果.
- 在main方法中调用isEvenNumber()方法, 并打印结果.
- 参考代码
- 略.
4.3 实例三: 获取最小值
- 需求
- 定义方法getMin(), 该方法内部有两个整数.
- 通过该方法, 获取两个整数的最小值, 并返回.
- 在main方法中调用getMin()方法, 获取最小值并打印.
- 参考代码
- 略.
5. 有参有返回值的方法
有参有返回值
的方法的意思是: 调用方法时, 我们不仅需要传入具体的参数, 方法执行完毕后, 还会给我们返回具体的结果.- 具体定义格式
- 下述这个格式就是
方法的通用格式
.
- 下述这个格式就是
public static 返回值的数据类型 方法名(参数类型 参数1, 参数类型 参数2) {
//方法体;
return 具体的返回值;
}
- 具体调用格式
//直接调用
方法名(参数值1, 参数值2); //参数的个数, 及对应参数的类型要和定义方法时的参数列表保持一致.
//输出调用
System.out.println(方法名(参数值1, 参数值2));
//赋值调用
数据类型 变量名 = 方法名(参数值1, 参数值2);
5.1 示例一: 定义求和方法
- 需求
- 定义方法getSum(), 接收两个int类型的整数.
- 获取上述两个整数的和, 并返回.
- 在main方法中调用getSum()方法, 并打印结果.
- 参考代码
- 略.
- 图解略.
5.2 示例二: 判断奇偶数
- 需求
- 定义方法isEvenNumber(), 该方法接收一个int类型的整数num.
- 判断num是奇数还是偶数, 并返回结果.
- 在main方法中调用isEvenNumber()方法, 并打印结果.
- 参考代码
- 略.
5.3 实例三: 获取最大值
- 需求
- 定义方法getMax(), 该方法接收两个整数.
- 通过该方法, 获取两个整数的最大值, 并返回.
- 在main方法中调用getMax()方法, 获取最大值并打印.
参数列表:
int a,int b
返回值类型:
int
- 参考代码
- 略
5.3 思考题
方法与方法之间可以嵌套定义吗
?- 方法没有具体的返回值时, 返回值的数据类型可以不写吗?
- 方法体中的
return
关键字可以省略吗?
6. 练习题
6.1 示例一: 打印偶数
- 需求
- 提示用户录入一个3~100之间的整数并接收.
- 打印1到该整数之间, 所有的偶数, 并按照3个一行的形式进行输出.
- 参考代码
- 略
6.2 案例二: 打印字符
- 需求
- 有定义一个方法,可以接受一个整数,
- 如果为[90,100]这个范围方法返回’A’
- 如果为[80,90)这个范围方法返回’B’
- 如果为[70,80)这个范围方法返回’C’
- 如果为[60,70)这个范围方法返回’D’
- 如果为[0,60)这个范围方法返回’E’
- 整数不在以上范围的返回’F’
- 参考代码
- 略
6.3 案例三: 遍历数组
- 需求
- 定义方法printArray(), 接收一个int类型的数组.
- 通过该方法, 实现遍历数组的功能.
- 在main方法中, 调用方法, 打印指定的数组.
- 参考代码
- 略
6.4 案例四: 获取数组最值
- 需求
- 定义方法printArray(), 接收一个int类型的数组.
- 通过该方法, 获取数组元素中的最大值.
- 在main方法中, 调用方法, 打印对应的结果.
- 参考代码
- 略
6.5 案例五: 模拟计算器
- 需求
- 定义方法, 接收两个int类型的整数.
- 分别获取这两个整数的加减乘除的运算结果, 然后返回.
- 在main方法中调用该方法, 并打印结果.
- 参考代码
- 略
7.方法参数深入研究
- 概述:
- 我们刚刚接触过方法,知道
方法如果没有调用是不会执行的
, 我们调用方法就需要对方法的形式参数进行赋值, 那么形式参数是基本数据类型
和引用数据类型
, 在传递的时候需要额外注意
- 我们刚刚接触过方法,知道
7.1. 方法的参数是基本数据类型
- 特点: 如果方法的参数是
基本数据类型,
我们在调用方法是需要传入基本类型对应的值,形参的改变不影响实参
- 例如:
- 已知int a = 10; int b = 20, 请定义方法,方法接受两个int类型的整数, 将两个整数置换
- 参考代码:
public class ArgsDemo {
public static void main(String[] args) {
// 定义变量
int a = 10;
int b = 20;
System.out.println("a:" + a + ",b:" + b);
change(a, b);
System.out.println("a:" + a + ",b:" + b);
}
public static void change(int a, int b) {
System.out.println("change方法开始了");
System.out.println("a:" + a + ",b:" + b);
int c=a;
a = b;
b = c;
System.out.println("a:" + a + ",b:" + b);
System.out.println("change方法结束了");
}
}
- 思考:
- main方法中的两条输出语句分别输出什么?
- why:
- main方法中有变量a和b,在main方法中使用a和b使用的是main中的a,b
- main方法中调用change方法将a和b传递过去,变量参与运算是将其值参与运算,所以我们传递过去的是10和20
- change方法中的形式参数int a,int b,其实是change方法中的局部变量,接受了10和20,然后方法中操作的是change方法中的a和b,和main方法中的a和b没关系
- 特点:
- 如果方法的参数是
引用数据类型,
我们在调用方法是需要传入引入类型对应的地址值,形参的改变影响实参
- 如果方法的参数是
- 例如:
- 请定义方法, 能够实现将数组中所有偶数元素变成以前的2倍
- 参考代码:
public class ArgsDemo2 {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
for (int x = 0; x < arr.length; x++) {
System.out.println(arr[x]);//1,2,3,4,5
}
change(arr);
for (int x = 0; x < arr.length; x++) {
System.out.println(arr[x]);//1,4,3,8,5
}
}
public static void change(int[] arr) {
for (int x = 0; x < arr.length; x++) {
//如果数组元素是偶数,值就变成了以前的2倍
if (arr[x] % 2 == 0) {
arr[x] *= 2;
}
}
}
}
- 思考:
- main方法中第二次输出数组, 数组的内容是否改变?
- 图解:
8. 方法重载
8.1 概述
同一个类
中, 出现方法名相同
, 但是参数列表不同的两个或以上的方法
时称为方法重载
. 方法重载与方法的返回值的数据类型无关
.- 注意: 参数列表不同分为两种情况
参数的个数不同
.对应参数的数据类型不同
.
8.2 示例代码
- 正确示例
public class MethodDemo01 {
public static void fn(int a) { //function
//方法体
}
public static int fn(double a) {
//方法体
}
}
public class MethodDemo02 {
public static float fn(int a) {
//方法体
}
public static int fn(int a , int b) {
//方法体
}
}
- 错误示例
public class MethodDemo01 {
public static void fn(int a) {
//方法体
}
public static int fn(int a) { //错误原因: 参数列表相同.
//方法体
}
}
public class MethodDemo02 {
public static void fn(int a) {
//方法体
}
}
public class MethodDemo03 {
public static int fn(double a) { //错误原因:这是两个类的两个fn方法
//方法体
}
}
8.3 案例: 判断数据是否相等
- 需求
- 定义方法compare(), 用来比较两个整型数据是否相等.
- 要求兼容所有的整数类型, 即(byte, short, int, long)
- 参考代码
public class MethodDemo01 {
public static void main(String[] args) {
//定义不同数据类型的变量
byte a = 10;
byte b = 20;
short c = 10;
short d = 20;
int e = 10;
int f = 10;
long g = 10;
long h = 20;
// 调用
System.out.println(compare(a, b));
System.out.println(compare(c, d));
System.out.println(compare(e, f));
System.out.println(compare(g, h));
}
// 两个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;
}
// 两个int类型的
public static boolean compare(int a, int b) {
System.out.println("int");
return a == b;
}
// 两个long类型的
public static boolean compare(long a, long b) {
System.out.println("long");
return a == b;
}
}
8.4 思考题
- 判断下述哪些方法是重载关系.
public static void open(){}
public static void open(int a){}
static void open(int a,int b){}
public static void open(double a,int b){}
public static void open(int a,double b){}
public void open(int i,double d){}
public static void OPEN(){}
public static void open(int i,int j){}
再来回顾一下重载的定义,相信能加深你的印象~
同一个类
中, 出现方法名相同
, 但是参数列表不同的两个或以上的方法
时称为方法重载
. 方法重载与方法的返回值的数据类型无关
.- 注意: 参数列表不同分为两种情况
参数的个数不同
.对应参数的数据类型不同
.
9. Debug调试
9.1 概述
Debug
是供程序员使用的程序调试工具
,它可以用于查看程序的执行流程
,也可以用于追踪程序执行过程来调试程序
。- Debug调试窗口介绍
- 略
9.2 示例
- 需求
- 定义getSum()方法, 用来获取两个整数和.
- 在main方法中调用getSum()方法.
- 参考代码
public class MethodDemo05 {
public static void main(String[] args) {
int a = 10;
int b = 20;
int sum = getSum(a, b);
System.out.println("sum: " + sum);
}
public static int getSum(int a, int b) {
int sum = a + b;
return sum;
}
}
9.3 步骤
加断点. 哪里不会点哪里.
- 即: 选择
要设置断点的代码行
,在行号的区域后面单击鼠标左键
即可
- 即: 选择
- 运行加了断点的程序, 就可以开始进行Debug调试了.
- 即:在代码区域
右键
, 然后选择Debug
开始执行.
- 即:在代码区域
- 开始调试时, 看哪里呢?
Debugger
窗口: 看代码执行到了哪里
.Console
窗口: 看程序执行过程中的结果展示
(就是控制台
).Variables
窗口: 看代码执行过程中,变量的变化
.
- 如何进行下一步呢?
F7: 逐过程调试
.F8: 逐行调试
.F9: 逐断点调试
.
- 如何删除断点?
- 选择要删除的断点,单击鼠标左键即可
- 如果是多个断点,可以每一个再点击一次。也可以一次性全部删除.