方法在计算机中的执行
方法被调用的时候,是进入到栈内存中运行。方法的运行区域是在栈内存中。
栈的特点是:先进后出。push pop。
保证一个方法调用完另一个方法后,可以回来。
方法为什么要在栈中运行自己。
sum 执行到return语句,会得到返回值30,传给rs,然后sum方法就从栈中被清理掉。
然后再执行main方法,打印rs的结果,main方法执行完成,main也会从栈中被清理掉。
程序执行完成之后,栈里的方法都会被清理。
Java的参数传递机制:
java的参数传递机制都是:值传递。
实参:在方法内部定义的变量。
形参:定义方法时,所声明的参数。
基本类型的参数传递
所谓值传递:指的是传输实参给方法的形参的时候,传输的是实参变量中存储的值的副本。
就是将实参变量的值拷贝一份出来,传递给形参。
java
package cn.ensource.parameter;
public class MethodDemo1 {
public static void main(String[] args) {
// 目标:理解方法的参数传递机制:值传递
int a = 10;
change(a);
System.out.println("main " + a); // 10
}
public static void change(int a) {
System.out.println("change1 " + a); // 10
a = 20;
System.out.println("change2 " + a); // 20
}
}
change函数退出之后:
引用类型的参数传递:
数组:传递的是堆内存地址,相当于浅拷贝,那应该会互相影响的。
也是传递的地址,不过是地址的副本,也就是拷贝了一份给形参。
这是一节比较特殊的关键课程,必须要懂。
java
package cn.ensource.parameter;
public class MethodDemo2 {
public static void main(String[] args) {
// 目标:引用类型的参数传递
int[] arr = new int[]{10, 20,30};
change(arr);
System.out.println("main方法:" + arr[1]);
}
public static void change(int[] arr) {
System.out.println("方法内1:" + arr[1]);
arr[1] = 222;
System.out.println("方法内2:" + arr[1]);
}
}
运行结果:
可以看到最后arr[1]中的值为222。
change函数从栈中退出之后:
引用类型参数传递的相关案例:
数组的传递:
打印int类型的数组内容:
需求:
输出一个int类型的数组内容,要求输出格式为:[11,22,33,44,55]。
分析:
使用一个方法来解决需求。同时也是方便别人复用。功能都是以功能提供的。
1)方法是否需要接收数据进行处理?需要接收一个int类型的数组,因此形参声明为: int[] arr
2)方法是否需要返回数据呢?不需要,方法内部直接输出数组的内容,无需返回,因此返回类型声明为:void
3)在方法内部的业务:遍历数组,并输出相应的内容。
java
package cn.ensource.parameter;
public class MethodCase1 {
public static void main(String[] args) {
// 目标:完成打印int类型的数组内容
int[] arr = {10, 20, 30, 40, 50, 60, 70, 80, 90};
// 打印数组
printArray(arr);
int[] arr2 = null;
printArray(arr2);
int[] arr3 = {};
printArray(arr3);
}
/**
*
* @param arr
*/
public static void printArray(int[] arr) {
if (arr == null) {
System.out.println(arr);
return;
}
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
// if (i == arr.length - 1) {
// System.out.print(arr[i]);
// } else {
// System.out.print(arr[i] + ",");
// }
System.out.print(i == arr.length - 1 ? arr[i] : arr[i] + ",");
}
System.out.println("]");
}
}
好的代码风格:层层拦截的风格。
运行结果:
该程序中,我们还使用三元运算符的方法。优雅专业的程序员的方法。
案例:比较两个int类型的数组是否一样。
需求:
如果两个int类型的数组,元素个数,对应元素的内容是一样的,我们就认为这两个数组是一样的。
1)方法是否需要接收数据进行处理?
需要接收两个int类型的数组,因此,形参声明为:int[] arr1, int[] arr2。
2)方法是否需要返回数据?
方法判断完需要返回:true和false。因此返回类型声明为boolean类型。
方法内部的业务:判断两个数组内容是否一样。
java
package cn.ensource.parameter;
public class MethodCase2 {
public static void main(String[] args) {
// 目标:完成判断两个int类型数组是否一样
int[] arr1 = {10, 20, 30, 40};
int[] arr2 = {10, 20, 30, 40};
System.out.println(equals(arr1, arr2));
}
public static boolean equals(int[] arr1, int[] arr2) {
// arr1、arr2是否都是null
if( arr1 == null && arr2 == null ) {
return true;
}
if(arr1 == null || arr2 == null ) {
return false;
}
if (arr1.length != arr2.length) {
return false;
}
// 比较两个数组的内容是否一样
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true; // 两个数组是一样的。
}
}
运行结果: