一、方法的内存原理
有以下代码
package com.zwcode;
public class MethodDemo01 {
public static void main(String[] args) {
study();
}
public static void eat() {
System.out.println("吃饭");
}
public static void sleep() {
System.out.println("睡觉");
}
public static void study() {
eat();
System.out.println("学习");
sleep();
}
}
执行的结果为
方法区存放的是四个方法,栈内存执行方法,首先是main方法,main方法中有study方法,study方法继续调用eat方法,输出吃饭。
当吃饭输出后,eat方法结束,eat方法出栈
接着输出学习,然后调用sleep方法,sleep方法进栈,输出“睡觉”
sleep方法结束后出栈,study方法也结束出栈,main方法也结束出栈,程序结束,栈内存空
总结:方法运行的区域是栈。
二、方法的传递机制
1.基本类型参数传递
有以下代码
package com.zwcode;
public class MethodDemo02 {
public static void main(String[] args) {
int a = 10;
change(a);
System.out.println(a);
}
public static void change(int a){
System.out.println(a);
a = 20;
System.out.println(a);
}
}
输出结果为
10
20
10
我们发现在调用change方法后,值并没有改变
总结:基本类型参数传递是值传递,只是把a的20传到change方法,相当于拷贝一个20到change方法,change方法对a的改变也只是改变change方法中的a的值。
2.引用类型的参数传递
有以下代码
package com.zwcode;
public class MethodDemo03 {
public static void main(String[] args) {
int[] arrs = {1,2,3,4};
change(arrs);
System.out.println(arrs[1]);
}
public static void change(int[] arrs){
System.out.println(arrs[1]);
arrs[1] = 222;
System.out.println(arrs[1]);
}
}
运行结果:
2
222
222
我们发现,这里与上次不能,成功的改变了值
分析如下:
总结:数组的值存放在堆内存,引用数据类型的值是用地址来指向的,在调用change方法时,地址并不会改变,所以在改动数据时,是对同一个地址指向的数据的改变。基本数据和引用数据的参数传递都是值传递,只不过前者是传递它存储的数据值,而后者传递的地址值。
三、案例
1.打印数组内容
package com.zwcode;
public class MethodDemo04 {
public static void main(String[] args) {
int a[] = {1,2,3,4};
int b[] = {11,22,33,44};
printArrays(a);
printArrays(b);
}
public static void printArrays(int[] arr){
//判断是否为空
if (arr != null && arr.length > 0){
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.print("]");
System.out.println();
}
}
}
结果:
[1,2,3,4]
[11,22,33,44]
2.从数组中查询元素的索引返回
package com.zwcode;
public class MethodDemo05 {
public static void main(String[] args) {
int a[] = {1,2,3,4,5};
int index = searchIndex(a, 2);
System.out.println("索引为:" + index);
}
public static int searchIndex(int[] arr, int data){
for (int i = 0; i < arr.length; i++) {
if (arr[i] == data){
return i;
}
}
return -1;
}
}
3.比较两个数组内容是否一样
package com.zwcode;
//比较两个数组内容是否一样
public class MethodDemo06 {
public static void main(String[] args) {
int a[] = {1,2,3};
int b[] = {1,2,3};
int c[] = {1,2,3,4};
boolean s = isSame(a, b);
System.out.println(s);
System.out.println(isSame(a,c));
}
public static boolean isSame(int[] arr1,int[] arr2){
//先判断长度
if (arr1.length != arr2.length){
return false;
}
//到这说明长度一样
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]){
return false;
}
}
//到这说明数组一样
return true;
}
}