方法
方法的概念
方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集,可以被重复调用。
- 方法必须先创建才可以使用,该过程称为方法定义
- 方法创建后并不是直接可以运行的,需要手动调用后才执行,该过程称为方法调用
方法的定义和调用
方法的四种格式:
- 1、无参无返回值
- 2、有参无返回值
- 3、无参有返回值
- 4、有参有返回值
1、无参的方法定义和调用
-
格式:
//定义方法 public static void 方法名(){ //方法体 } //调用方法 方法名();
-
范例:
public static void main(String[]args){ method(); } public static void method(){ System.out.println("111"); }
方法必须先定义后调用!
2、带参数的方法定义和调用
-
格式:
//定义方法 public static void 方法名(参数1,参数2···){ //方法体 } //调用方法 方法名(参数1,参数2···);
-
范例:
public static void main(String[]args){ method(1,2); } public static void method(int a,int b){ System.out.println(a+b); }
方法调用时,参数的数量和类型必须与方法定义中的设置相匹配,否则程序将报错
-
形参和实参
- 形参:方法定义中的参数 等同于变量
- 实参:方法调用中的参数 等同于变量或常量
3、带返回值的方法的定义和调用
-
格式:
//定义方法 public static 数据类型 方法名(){ return 返回值数据; } //调用方法 定义变量接收方法的返回值,数据类型要和返回值相同 数据类型 变量名 = 方法名();
-
范例:
public static void main(String[]args){ int num = method(); } public static int method(){ int a = 10; return a; }
return后面的返回值类型要和方法定义时的数据类型相同!
4、带返回值带参数的方法的定义和调用
-
格式:
//定义方法 public static 数据类型 方法名(参数1,参数2···){ return 返回值数据; } //调用方法 数据类型 变量名 = 方法名(参数1,参数2···);
-
范例:
public static void main(String[]args){ int sum = method(1,2); } public static int method(int a,int b){ int s = a+b; return s; }
方法的调用过程
方法的通用格式
public static 返回值类型 方法名 (参数){
方法体;
return 数据;
}
-
public static 修饰符,目前的学习先记住格式
-
返回值类型 方法操作完毕之后返回的数据的数据类型
-
如果方法操作完毕,没有数据返回,这里写void,而且方法体中一般不写return
方法名:调用方法的时候使用的标识
参数: 由数据类型和变量名组成,多个参数之间用逗号隔开
方法体: 完成功能的代码块
return: 如果方法操作完毕,有数据返回,用于把返回的数据给调用者
-
定义方法时,要做到两个明确:
- 明确返回值类型:定义方法时就要考虑到是否有数据返回,如果没有写void,如果有写对应 的数据类型
- 明确参数:明确参数的类型和个数
-
调用方法时注意:
- void类型的方法,直接调用即可
- 非void类型的方法,推荐使用变量接收调用的返回值
方法的重载
-
概念:
- 方法重载指在一个类中,有多个方法名相同,但是参数列表不同(参数列表包括:个数、类型、顺序)的方法
-
注意:
- 重载仅对应方法的定义,与方法的调用无关,调用方式参照标准格式,重载仅针对同一个类中方法的名称
- 与参数进行识别,与返回值无关,换句话说不能通过返回值来判定两个方法是否相互构成重载
范例:
public class Demo{
public static void fn(int a){
System.out.println("参数为一个int");
}
public static void fn(double d){
System.out.println("参数为一个double");
}
public static void fn(int a,double d){
System.out.println("参数第一个为int,第二个为double");
}
public static void fn(double d,int a){
System.out.println("参数第一个为double,第二个为int");
}
}
方法的递归调用
指一个方法在运行过程中自己调用自己
- 方法必须有递归的结束条件,条件不满足递归前进,条件满足递归返回
- 递归前进段必须要有做出一些变化,向结束条件靠近
- 递归调用不一定有返回值
- 不能调用次数过多,容易导致栈内存溢出
- 尽量使用迭代代替递归
实例:求5的阶乘
public static void main(String[] args) {
System.out.println(fun(5));
}
public static int fun(int n) {
if (1 == n)
return 1;
else
return n * fun(n - 1);
}
方法的参数传递
1、方法参数传递 基本类型
-
举例代码
public class Test1{ public static void main(String[] args){ int a = 10; System.out.println("调用change方法前a的值为:"+a); change(); System.out.println("调用change方法后a的值为:"+a); }\ public static void change(int num){ num = 99; System.out.println("change方法中num的值为:"+num); } }
-
结论:
-
基本数据类型的参数,形式参数的改变,不影响实际参数
-
结论依据:
- 每个方法在栈内存中,都会有独立的占空间,方法运行结束后就会弹栈消失
-
基本类型数据定义后存储在栈内存中,传递值时其实就是将这个值复制给另一个变量
-
2、方法参数传递 引用类型
-
举例代码
public class Test2{ public static void main(String[] args){ int[] arr = {10,20,30}; System.out.println("调用change方法前arr的第一个元素的值为:"+arr[0]); change(); System.out.println("调用change方法后arr的第一个元素的值为:"+arr[0]); }\ public static void change(int nums){ //修改nums中第一个元素的值 nums[0] = 99; System.out.println("change方法中nums的第一个元素的值为:"+nums[0]); } }
-
结论:
-
引用数据类型的参数,形式参数的改变,影响实际参数的值
-
结论依据:
- 引用数据类型的传参传入的是内存地址,内存中会由两个变量同时指向同一个内存的效果,所以即使方法弹栈,堆内存中的数据已经改变,实际参数再次指向这个地址其中的值已经发生了改变
-
引用数据类型数据存储的时候,其中栈内存中存储变量名和一个堆内存中的地址,堆内存中存储引用数据类型中的数据内容,传递值时其实传递的是内存地址
-