方法
方法概述
一段具有独立功能的代码块
必须先创建方法,需要手动调用后才执行
方法的定义格式
public static void 方法名( ) {
方法体; // 方法所包裹的逻辑代码
}
方法的调用格式
在main方法中,通过方法名调用
方法名();
方法的调用过程
main方法先被调用,随后执行main方法中的逻辑代码,当遇到了调用自定义方法的语句,执行自定义方法内部的逻辑代码,自定义方法执行完毕之后,继续回到main方法中执行
注意: 方法与方法之间是平级关系, 不能嵌套定义
形式参数和实际参数
形参
全称形式参数,是指方法定义中的参数
public static void method(int a){
}
实参
全称实际参数,方法调用中的参数
method(10);
带返回值方法定义和调用
方法的返回值类型,和返回值的关系
对应关系,方法的返回值类型,必须跟返回值的类型对应,否则引发编译错误
返回值的接收
带有返回值的方法调用之后,会产生一个运算后的结果,这个结果没有接收被使用的话,这个返回值将毫无意义
注意 : 后期有具体返回值的方法, 也可以进行直接调用
return关键字的作用
作用1 : 将所在的方法结束
作用2 : return关键字用于将方法运算的结果,返还给调用处
方法的通用格式
public static 返回值类型 方法名(参数){
方法体;
return 数据;
}
//如果方法操作完毕,没有数据返回,返回值类型写void,方法体不写return
//void类型的方法,直接调用,
//非void类型的方法,用变量接收调用
定义方法时,要做到两个明确
明确参数:明确参数的类型和数量
明确返回值类型:明确方法操作完毕之后,是否有数据返回,如果没有,写void;如果有,写对应的数据类型
方法注意事项
-
方法不能嵌套定义
-
方法的返回值类型为void,表示该方法没有返回值
-
return语句下面,不能编写代码,因为永远执行不到,属于无效的代码
方法重载
方法重载:在同一个类中方法名相同,参数列表不同,与返回值无关
参数列表不同:
1,类型不同
2,个数不同
3,顺序不同(毫无意义)
方法重写:在继承体系中,子类出现了和父类一模一样的方法声明(方法名,参数列表,返回值类型)
方法参数传递基本类型
对于基本数据类型的参数,形式参数的改变,不影响实际参数
public class Test1 {
//方法参数传递为基本数据类型 :传入方法中的是具体的数值
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 Test2 {
//方法参数传递为引用数据类型 : 传入方法中的是内存地址
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 Recursive {
public static void main(String[] args) {
/* for (int i = 0; i <args.length ; i++) {
System.out.println(args[i]);
}*/
System.out.println(f(100));
}
private static double f(double n) {
if (n == 1) {
return 1;
} else {
return n * f(n - 1);
}
}
}