java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java方法参数传递机制:值传递与地址传递区别

Java方法参数传递机制详解:值传递与地址传递的区别

作者:JAVAnuonuo

还在纠结值传递和引用传递的区别吗?本文用通俗易懂的例子和内存分析,帮你彻底搞懂方法调用时参数是如何传递的,以及为什么修改形参有时会影响实参,有时不会

值传递

值传递

方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。

public class Explore {
	public static void main(String[] args) {
	    int  scores = 100;
	    System.out.println(scores);//100
	    test(scores);//调用函数
	    System.out.println(scores);//100
	  }
	  
	  public static void test(int a) {
	    System.out.println("***"+a);//***100
	    a = 0;
	    System.out.println(a);//0
	  }
}
输出结果
100
***100
0
100

上述代码中scores被赋值100,经过test方法将100这个值传递给了a,易知a是新定义的一个变量,即形参,当a改变时,scores(实参)不会改变,输出结果仍为100。

地址(引用)传递

引用传递

是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

public static void main(String[] args) {
    int [] scores = {100,200};
    System.out.println(scores);//[I@52e922
    System.out.println(scores[0]);//100
    test(scores);//调用函数
    System.out.println(scores[0]);//0
  }
  public static void test(int [] array) {
    System.out.println(array);//[I@52e922
    array[0] = 0;
    
  }
}
输出结果
[I@52e922
100
[I@52e922
0

这次代码中定义scores为一个int类型的一维数组;

输出scores的结果为数组在栈内存中存储的地址;

输出scores[0]的结果为数组在堆内存中存储的100;

调用函数,由结果可知函数将存储scores数组的地址传递给了array,此时scores与array均指向栈内存中的数组存储的地址,可知array[0]=scores[0],array[1]=scores[1]。

如果对array[0]进行修改,则scores[0]也会随之而变。

与值传递相比,地址传递中函数直接对实参进行修改,没有形参。

就好比一个盒子里放了一个魔方,起初只有A知道盒子在哪,但A告诉了B;

A去玩魔方,玩完将魔方放回盒子里;

这时B再去玩,就是玩A剩下的;B玩完之后A再去,就是A玩B剩下的;

这样AB都可以对魔方进行修改,而反馈是面向AB两人的。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文