调用一个方法时的流程
方法: 什么是方法
方法,就是实现某个功能的代码块
方法的作用:
简化自己的代码,当我们定义与调用某一个功能时,如果不使用方法,那我们每次调用该功能,都需要输入该功能对应的大量代码。
所以,我们将一个功能,封装在一个方法里,当我们需要用到这个功能时,就调用这个方法,这样就能简化我们的代码。
方法的形式:
访问权限修饰符 返回值类型 方法名字(参数类型 参数1,参数2,…){
方法体
//返回值
}
例如主方法:
public static void main(String[] args){方法体//return XXX; //返回值,如果上面是void这里就不要return
}
注意:
方法名字,除了主方法,是可以随意命名的
返回值的类型是什么,返回值类型的名称就是什么:
例如我们没有返回值,返回值类型就是void
我们返回值为整数形式,返回值类型就可以用int
··········
方法的参数:
方法调用时,我们在定义方法时,定义了几个参数,调用时,就要传入几个参数
定义时传入的参数,叫做形式参数,形参(声明该方法被调用时,需要传入一种什么样的参数:包括类型,个数,顺序)
调用时传入的参数,叫做实际参数,实参,实参一定要按照形参定义的类型,个数,顺序来传入
即形参实参需要一一对应
调用一个方法时的流程:
1.加载class文件
2.调用主方法(主方法在栈内存中开辟空间)
3.在主方法中,用类名.方法名,调用sum方法,传入参数
4.sum方法被调用,开始执行(在栈内存中开辟空间)
5.sum方法中,对传入的参数进行操作
6.并得到一个结果,返回该结果
7.主方法中定义一个变量,接收sum方法得到的结果
8.打印得到的结果
注意:
若一个方法是被修饰的静态方法,该方法在某个类中定义,同时在该类中调用,那么可以直接用方法名去调用,等同于 类名.方法名
方法必须定义在类中,不能定义在方法中
方法的可变参数:
在方法的定义阶段,传入形参时,如下列形式定义形参:
static void add(double cutoff,int... arr){}
其中 int… arr[] 就是可变参数
可变参数本质就是一个语法糖==>用来方便程序员的
如上面那个代码,我们在传入实参时,就可以传入任意个数的参数了:
add(0.9,1,2,3,4,5.......)
运用实例:
public class Demo {public static void main(String[] args) {//此处传入可变参数int[] arr = times(0.5,2,4,6,8);//结果为 [1,2,3,4]System.out.println(Arrays.toString(arr)); }//此处定义可变参数public static int[] times(double cutoff,int...arr) {for (int i = 0; i < arr.length; i++) {arr[i] = (int) (arr[i] * cutoff);}return arr;}
}
方法的重载:
观察下列代码:
static void add(int a,int b){}
static void add(double a,int b){}
static void add(int a,double b){}
static void add(double a,double b){}
static void add(int a,int b,int c){}
这种代码是可行的,为什么?
这就是方法的重载:
在同一个类中,允许存在同名方法,前提是他们的 参数列表:参数个数,参数顺序,参数类型 至少有一个存在区别 ==>即:两同一不同
我们在调用时,会根据传入的实参的 个数,顺序,类型 ,来调用对应的方法
方法的值的传递机制:
方法的值的传递机制分为两种类型:
基本类型参数 / 引用类型参数
基本类型参数:
观察下列代码:
public static void main(String[] args){int num=10;change(num);System.out.println(num);
}
static void change(int num){System.out.println(num);num=20;System.out.println(num);
}
该代码输出结果为: 10 20 10
分析:首先初始化num=10,然后调用方法,方法中首先输出10,然后改变num=20,然后输出num=20,由于我们传递基本类型参数时,传递的是参数值,所以主方法中的num值并不会收到方法中的影响,此时主方法中输出的num还是10
public static void main(String[] args){int[] arr={10};change(arr);System.out.println(arr[0]);
}
static void change(int[] arr){System.out.println(arr[0]);arr[0]=20;System.out.println(arr[0]);
}
该代码输出结果为: 10 20 20
分析:首先初始化int[] arr={10},然后调用方法,方法中首先输出10,然后改变arr[0]=20,然后输出arr[0]=20,由于我们传递引用类型参数时,传递的是内存地址,在内存地址中,arr[0]的数值已经被修改为20,所以主方法中的arr[0]输出为20;
总结:
传递基本类型参数:传递的是参数值
传递引用类型参数:传递的是参数所引用的堆内存的地址