基本数据类型:
看一个案例 MethodParameter01.java
首先创建AA类,在AA类中定义一个swap方法有两个形参,,在方法中将a和b交换。
在main方法,定义一个变量a和变量b,分别赋值10,20.
在创建AA对象obj,调用swap方法完成变量a和变量b互换,输出后a=20,b=10;
但是直接打印输出变量a和变量b还是a=10,b=20
例:
public class MethodParameter01 {
//编写一个 main 方法
public static void main(String[] args) {
int a = 10;
int b = 20;
//创建 AA 对象 名字 obj
AA obj = new AA();
obj.swap(a, b); //调用 swap
System.out.println("main 方法 a=" + a + " b=" + b);//a=10 b=20
}
}
class AA {
public void swap(int a, int b) {
System.out.println("\na 和 b 交换前的值\na=" + a + "\tb=" + b);//a=10 b=20
//完成了 a 和 b 的交换
int tmp = a;
a = b;
b = tmp;
System.out.println("\na 和 b 交换后的值\na=" + a + "\tb=" + b);//a=20 b=10
}
}
结果:
基本数据类型是存放在JVM中的栈空间里,传递的是值(值拷贝),调用方法会在栈空间里新开辟一个独立的空间,main方法中的值会拷贝给这个空间,方法中的操作都是在这个独立的空间完成的,方法结束后这个空间会随着方法的结束而消亡,方法中做任何的操作,main方法中的变量的值都不会发生改变
引用数据类型的传参机制
看一个案例 MethodParameter02.java
首先定义一个AA类,在AA类中定义一个方法f1,形参为一个int型数组,
在方法中将200赋值给这个数组的第一位
在mian方法中定义一个测试数组array,数组中分别有10,20,30,40这四个值,
调用f1方法后,再次遍历array数组变成了:200,20,30,40
例
public class MethodParameter02 {
//编写一个 main 方法
public static void main(String[] args) {
//定义一个测试数组array
int[] array = {10,20,30,40};
//遍历输出调用方法前的值
System.out.println("调用方法前");
for (int i : array) {
System.out.print(i+" ");
}
//创建AA类对象aa
AA aa = new AA();
//aa调用f1方法
aa.f1(array);
// 遍历输出调用方法后的值
System.out.print("调用方法后");
for (int i : array) {
System.out.println(i+" ");
}
}
}
//定义一个AA类
class AA{
//定义一个方法f1,形参为一个int型数组
public void f1(int[] arr){
//将200赋值给这个数组的第一位
arr[0] = 200;
}
}
结果:
引用数据类型是存放在JVM中的堆空间里,传递的是地址(传递也是值,但是值是地址),调用方法时也会开辟一个独立空间,main方法中的地址会拷贝给方法中的形参,这时他们都指向堆空间,方法中的形参进行修改,main方法中实参也会改变
结论:
基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参!
引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!