基本数据方法传参机制
形参的任何变化不会影响实参
基本数据实参传递到方法中是值传递,不会影响本来的实参
ublic class Method1{
public static void main(String[] args) {
int a1 = 10;
int b1 = 20;
AA iu =new AA();
iu.add(a1,b1);
System.out.println("a1="+a+" "+"b1="+b)
}
}
class AA{
public void add(int a,int b){
System.out.println("交换前a="+a+"b="+b)
int num = a;
a = b;
b = num;
System.out.println("交换后a="+a+"b="+b)
}
}
上面这段代码会输出:
交换前a=10 b=20
交换后a=20 b=10
a1=10 b1=20
可以看出虽然将a1和b1实参传入了add方法中进行了交换但是在main方法中还是原来的值,这是因为基本数据类型传递的是值(值拷贝),所以形参的任何改变不会影响实参。在不同的方法栈改动各自的变量
内存中会开辟一个main方法栈空间 依次进行 创建变量 a1 b1 创建对象 调用add方法
当调用add方法时会再开辟一个add方法栈并且将a1和b1的值传给方法的形参 a和b ,相同与赋值了10和20给它们,但是main栈中的a1和b1不会受影响。add方法再怎么更改也是改动a和b的值。
内存图:
引用数据方法传参机制
上方的基本数据类型,在方法中传参修改,并不会影响到实参的值。但是如果是引用数据作为实参传参到方法进行修改是会改变实参的值的。由于基本数据是采用值传递相当是复制了一个值给到方法,两者之间没有关联。但引用数据类型采用的是引用传递(地址传递),相当是给了一把相同的钥匙一起可以打开对应的引用空间。所以可以进行修改(相当于是两人共同管理)
举列说明:
创建一个方法 接收一个数组,并且修改下标0的值。在main方法分别在调用修改方法前后输出此数组,并且在修改方法中也输出数组
public class Method3{
public static void main(String[] args) {
int [] arr1 = {1,2,3};
for (int a :arr1 ) {
System.out.println("修改前"+a);
}
B b = new B();
b.test1(arr1);
for (int a :arr1 ) {
System.out.println("修改后"+a);
}
}
}
class B{
public void test1(int [] arr){
arr [0] = 100;
for (int a :arr ) {
System.out.print("方法修改后输出"+a);
}
System.out.println();
}
}
以上方法在内存中
1.在栈中创建main方法栈
2.堆中开辟数组空间对应下标依次复制 1,2,3并把此空间的地址给到main栈中的 arr1数组名
3.遍历数组输出 1,2,3
4.在main栈中创建对象b,并且使用b调用B类的方法test1
5.在栈中在开辟一个test1方法栈空间,并且将main栈中arr1的地址复制一份给到test1中的形参arr
6.test1栈中通过复制过来的地址找到堆中对应的数组空间,对下标0的值进行修改
7.在test1栈中遍历输出数组,test方法栈退出回收
8.回到main栈空间,通过地址找到堆中的数组空间遍历输出,main栈退出
内存图: