Java是值传递!Java是值传递!Java是值传递!
值传递&引用传递
- 值传递:将参数传入函数后,无论函数内部对参数进行了什么操作,跳出函数后,参数值依旧是原来的值,不会发生任何改变。
- 引用传递:将参数传入函数后,函数内部对参数进行的修改会直接影响到外部。
接下来,我将用两个实验来证明Java是值传递。
实验1
public static void main(String[] args) {
int a=10;
System.out.println("a="+a);
help(a);
System.out.println("a="+a);
}
public static void help(int a){
a+=10;
System.out.println("a="+a);
}
实验1的运行结果
a=10
a=20
a=10
从实验1的运行结果我们可以看到,我们在help接口内部对a进行了+10操作,但是当跳出接口后并没有对a产生影响,a依旧等于10.
实验2
public static void main(String[] args) {
Demo demo1=new Demo();
Demo demo2=new Demo();
demo1.name="xiaohuanzi";
demo1.age=25;
demo2.name="congcong";
demo2.age=18;
System.out.println("demo1="+demo1.toString());
System.out.println("demo2="+demo2.toString());
help(demo1,demo2);
System.out.println("demo1="+demo1.toString());
System.out.println("demo2="+demo2.toString());
}
public static void help(Demo demo1,Demo demo2){
Demo temp=demo1;
demo1=demo2;
demo2=temp;
System.out.println("demo1="+demo1.toString());
System.out.println("demo2="+demo2.toString());
}
实验2的运行结果
demo1=Demo{name='xiaohuanzi', age=25}
demo2=Demo{name='congcong', age=18}
demo1=Demo{name='congcong', age=18}
demo2=Demo{name='xiaohuanzi', age=25}
demo1=Demo{name='xiaohuanzi', age=25}
demo2=Demo{name='congcong', age=18}
通过实验2的运行结果我们发现,当参数是引用类型是,内部的对参数的修改依旧不会对外部产生影响。
深入理解Java的值传递
虽说Java是值传递,但是也会有引用传递的效果,因为Java的值传递的那个值是地址。来,让我们看个实验。
实验3
public static void main(String[] args) {
int[] arr={0,1,2,3,4,5};
System.out.println("arr="+ Arrays.toString(arr));
help(arr);
System.out.println("arr="+ Arrays.toString(arr));
}
public static void help(int[] arr){
for(int i=0;i<arr.length;i++){
arr[i]+=10;
}
}
实验3运行结果
arr=[0, 1, 2, 3, 4, 5]
arr=[10, 11, 12, 13, 14, 15]
通过实验3的运行结果我们发现,help接口对数组进行修改真正影响到了arr。让我们来分析一下。

因为Java对于引用类型的参数传递的是地址,因此形参arr也是指向数组,因此对形参的修改直接会影响到数组。
那实验二是什么情况呢?我们来分析一下。

实参和型参demo1都指向“xiaohuanzi”,实参和形参demo2都指向“congcong”,当形参demo1和demo2交换后,形参demo1指向“congcong”,形参demo2指向“xiaohuanzi”,但是实参demo1和demo2依旧是原来的指向并没有改变,这也就说通了实验2的运行结果,同时也更加说明,Java是值传递而不是引用传递。