在学习Java的时候,很多人都会告诉我们Java中是值传递,很多人可能对此并不是很理解,比如下面的两个例子:
第一个
public class t {
public static void main(final String[] args) {
int a=10;
System.out.println("a is "+a);
fun(a);
System.out.println("a is "+a);
}
public static void fun(int a){
a=88;
}
}
/*
输出结果:
a is 10
a is 10
*/
第二个
public class t {
public static void main(final String[] args) {
int[] a=new int[]{1,2,3,4,5};
for (int i : a) {
System.out.print(i+" ");
}
System.out.println();
fun(a);
for (int i : a) {
System.out.print(i+" ");
}
System.out.println();
}
public static void fun(int []a){
a[2]=88;
}
}
/*
输出结果:
1 2 3 4 5
1 2 88 4 5
*/
看了上面的两个例子我们可能就会产生疑惑,第一个例子我们可以理解是值传递的效果,形参的改变并没有引起实参的改变;
但对于第二个例子的结果可能就会感到一些疑惑了,这不是函数中的改变也引起了实际的改变吗,就会认为这是属于引用传递
的效果,很可能就会错误的认为java中既有值传递也有引用传递,当传递的参数是基本的数据类型时就是值传递,当传递的参
数是对象时就是引用传递。
其实上面的理解是不对的,首先我们介绍一下在程序中是如何定义和区分值传递以及引用传递的:
值传递: 是在进行参数传递的时候将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改则不会影响到实
际的参数;
引用传递: 是在进行参数传递的时候将实际参数的地址直接传递给形参,这样在函数中进行相应的修改时会影响到实际的
参数的值;
通过上面的定义介绍,我们可以知道值传递和引用传递一个重要的区别就是看有没有复制一份进行传递,第一个例子是很好理解,
第二个例子其实是将a的地址复制了一份复制给了形参,因此他应该是属于值传递的范畴;
具体的介绍大家可以看看下面的这篇博客:
https://blog.csdn.net/bjweimengshu/article/details/79799485