方法
1. 概述
-
概述:就是一段具有独立功能的代码块,不调用就不执行
-
作用:
-
如果程序里面有好几段内容是需要实现相同功能,不使用方法的话,会导致有大量重复的代码。这种重复代码每次都要重新写一遍。所以如果不用方法,代码的重复度太高,复用性太差
-
方法的出现,把重复代码变成类似于‘共享单车’的存在,谁有需要就直接用。提高了代码的复用性
-
-
前提:
- 方法必须是先创建才可以使用,该过程称为方法定义
- 方法创建后并不是直接运行的,需要手动在代码中调用后才可以执行,该过程称为方法调用
2. 方法的定义和调用
- 格式
//方法定义格式(无参数、无返回值的公共静态方法)
public static void 方法名(){
//方法体:就是需要复用(被反复使用)的逻辑代码
}
//范例
public static void printHello(){
System.out.println("Hello method!");
}
//方法调用:方法名();
//范例:
public static void main(String[] args) {
printHello();
}
-
注意事项
- 方法必须先定义后调用,否则程序将报错
- 方法与方法之间是平级关系,不能嵌套定义
3. 方法的调用过程
- 方法没有被低调用的时候,都在方法区中的字节码文件(.class)中存储
- 方法被调用的时候,需要进入到栈内存中运行
4. 练习:奇偶数判断
- 需求
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yer2bqtM-1654653176979)(day05.assets/1619514609361.png)]
- 思路
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V0fNKgn7-1654653176981)(day05.assets/1619514649531.png)]
- 代码演示
public static void main(String[] args){
//3.调用方法
method();
}
//1.定义一个方法,功能为:判断一个数是否为奇数或者偶数
public static void method(){
//2.判断奇偶数逻辑
int a=10;
if(a%2==0){
System.out.println("偶数");
}else{
System.out.println("奇数");
}
}
5. 带参数方法的定义和调用
-
为什么要有带参数方法
- 当方法内部逻辑有用到需要根据不同用户,不同需求去变化的值的时候,就可以定义带参数方法,把这种可能会改变的值用方法的参数替代
-
带参数方法的定义
//单个参数
public static void 方法名(数据类型 变量名){方法体;}
//范例
public static void method(int num){方法体;}
//多个参数
public static void 方法名(数据类型 变量名1,数据类型 变量名2,...){方法体;}
//范例
public static void getMax(int num1,int num2){方法体;}
//注意
//1.方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序都将报错
//2.方法定义时,多个参数之间使用逗号分隔
-
带参数方法的调用
为什么要有带参数方法 -
当方法内部逻辑有用到需要根据不同用户,不同需求去变化的值的时候,就可以定义带参数方法,把这种可能会改变的值用方法的参数替代
-
带参数方法的定义
-
//单个参数
public static void 方法名(数据类型 变量名){方法体;}
//范例
public static void method(int num){方法体;}
//多个参数
public static void 方法名(数据类型 变量名1,数据类型 变量名2,…){方法体;}
//范例
public static void getMax(int num1,int num2){方法体;}
//注意
//1.方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序都将报错
//2.方法定义时,多个参数之间使用逗号分隔
6. 形参和实参
- 概念
- 形参:形式参数,是指方法定义中的参数
- 实参:实际参数,方法调用中的参数
7. 带返回值方法的定义和调用
-
为什么要有带返回值的方法
- 我们经常会根据一个方法产出的结果,来去组织另外一段代码逻辑,为了拿到这个方法产生的结果,就需要定义带有返回值的方法
-
带返回值方法的定义
-
带返回值方法的调用
-
代码演示
//案例:计算两个数的乘积
public static void main(String[] args) {
//3.调用方法,因为方法定义了两个参数,都是整数,所以这里要给两个整数的实参
//4.因为方法有返回值,所以可以在方法调用处使用一个变量接收这个方法调用完的返回值
//5.方法返回值什么类型,接收的变量就应该是什么类型
int result = cheng(2, 3);
System.out.println(result);//结果:6
}
//1.两个整数的乘积,结果还是整数,所以返回值类型应该为int
public static int cheng(int num1,int num2) {
//2.通过return关键,返回乘积
return num1 * num2;
}
8. 带返回值方法的练习:求两个数的最大值
-
需求:设计一个方法可以获取两个数的较大值,数据来自于参数
-
思路:
9. 方法通用格式
- 格式
10. 方法的注意事项
-
方法不能嵌套定义
-
方法的返回值类型为void,表示该方法没有返回值,没有返回值的方法可以省略return语句不写,如果要写return语句,后面不能跟具体的数据
-
return语句下面,不能编写代码,因为永远执行不到,属于无效代码
-
return语句,如果要返回值,只能带回一个结果
//案例:没有返回值的方法,可以省略return不写
public static void eat(){
System.out.println("吃饭");
//return的其中一个作用,是结束整个方法,但是不可以带返回值
return;
//return 3; 方法本身没有规定返回值,在此处就不能带返回值,因为你也不知道返回什么类型比较合适
}
//案例:计算器加法运算
public static int add(int num1,int num2){
// return的第二个作用,就是返回一个值
return num1+num2;
}
//案例:return语句下面,不能编写代码
public static void drink(int age){
if(age<8){
System.out.println("喝白开水");
//此处是个if判断语句,按照逻辑推断,如果进入if语句中,下面的代码逻辑肯定是不想再执行
//如果此处不加以限制,if执行结束,代码依然会执行:喝红牛
//所以此处可以加上return,直接结束方法
return;
//注意,说的return下面不能加代码,是指同一个逻辑代码块(大括号)中而已
}
System.out.println("喝红牛");
}
11. 方法重载
-
概念:在同一个类中,方法名相同,参数列表不同(参数顺序不同也算不同,变量名不同不算)的多个方法,形成了方法的重载。
-
方法签名:JVM调用方法的时候是通过方法签名去区分的,方法签名包括方法名,参数数量、类型和顺序
-
注意:参数顺序不同虽然也可以构成方法重载,但是不推荐,没有意义
12. 方法重载练习
-
需求:使用方法重载的思想,设计比较两个整数是否相同的方法,兼容全整数类型(byte,short,int,long)
-
思路:
13. 方法参数传递:基本数据类型
-
方法的形参在内存当中也就是一个变量而已
-
一个方法在传递参数的时候,如果是基本数据类型,那么传递的就是该变量所记录的具体的数值
public static void main(String[] args) {
int number = 100;
System.out.println("main方法中,调用change方法前:" + number);//结果:100
//基本数据类型,传递的是number的数值,而非变量
change(number);
//打印的变量,依然还是main方法中的变量,此变量的值未有任何改变,依然是100
System.out.println("main方法中,调用change方法后:" + number);//结果:100
}
//方法的形参相当于是这个方法中的一个局部变量,属于change方法,和main方法中的变量不是同一个
public static void change(int number) {
//在未执行下方赋值操作时,从main方法传递过来的是值100,将100赋值给了change方法的变量number
//此时修改的是change方法中的变量number值,对main方法中的number无影响
number = 200;
System.out.println("在change方法中的:" + number);//结果:200
}
14. 方法参数传递:引用数据类型
- 方法传递,如果传入的是引用数据类型,传进去的就是该引用数据类型的内存地址
public static void main(String[] args) {
//定义一个数组,数组是引用数据类型
int[] arr = {23, 12, 44, 77};
//该数组在堆内存中的一个空间存放,变量arr持有的是这个空间的地址
System.out.println("在main方法中,调用change方法前:" + arr[1]);//结果:12
//arr是引用数据类型变量,传入的就是arr持有的数组在堆内存的地址,而非数组本身
change(arr);
System.out.println("在main方法中,调用change方法后:" + arr[1]);//结果:0
}
public static void change(int[] arr) {
//调用方法,将传递过来的地址赋值给了change方法中的变量arr,change方法中的arr也持有这个地址
//通过持有的地址,可以找到堆内存中的数组,所以可以对其修改值
arr[1] = 0;
//打印的就是修改之后的0值
System.out.println("在change方法中的:" + arr[1]);//结果:0
}
15. 案例:数组遍历
-
需求:设计一个方法,用于数组遍历,要求遍历的结果是在一行上的。例如:[11,22,33,44,55]
-
思路:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0S74Zsxx-1654653176988)(day05.assets/1619679621464.png)]
- 代码演示
public static void main(String[] args) {
//1.静态初始化一个数组
int[] arr = {11, 22, 33, 44, 55};
printArr(arr);
}
//2.定义一个方法,对数组进行遍历。因为是打印,所以是不需要返回值的
public static void printArr(int[] arr) {
//3.要打印数组中所有数据,必须要先遍历数组
for (int i = 0; i < arr.length; i++) {
//4.将数组中每个元素取出来
int num = arr[i];
//5.打印数组中该元素的值,但是因为有格式要求,所以不要换行打印
//6.当i=0和i是最后一个索引的时候,打印格式要加上中括号
if (i == 0) {
System.out.print("[" + num + ", ");
} else if (i == arr.length - 1) {
System.out.print(num + "]");
} else {
//7.打印的数字之间要用逗号和空格隔开
System.out.print(num + ", ");
}
}
}