Java解惑之值传递or引用传递

在说这个问题之前,我们先来看以下几段代码

基本数据类型

public class Test3 {

public void aa(int num){
    num=20;
}

public static void main(String[] args) {
    int num=10;
    Test3 t3=new Test3();
    t3.aa(num);
    System.out.println(num);
}
}

输出结果:10

结果分析
当我们将num传递进去之后,实际上aa对num做了一个拷贝,copy后的值与原来的值没有关系了,故输出10。

数组类型

public class Test3 {

public void bb(int[] arr){
    arr[0]=1;
}

public static void main(String[] args) {
    int[] arr={3,4,5};
    t3.bb(arr);
    System.out.println(arr[0]);
}
}

输出结果:1

我们在对bb方法做一个修改

public void bb(int[] arr){
    //arr[0]=1;
    int[] arr2={1,2,3};
    arr=arr2;
}

结果分析
对于数组而言,当我们创建一个数组之后,jvm为数组分配了三个连续的内存空间,这个arr就指向这片内存空间。方法bb得到的是数组的引用的一个拷贝
情况1修改了第一个空间块中的内容,故输出的是修改后的内容
情况2只是将arr的引用指向了另一片内存空间,原本的那片内存空间并未发生变化。

String类型

public class Test3 {

public void cc(String str){
    str="cba";
}

public static void main(String[] args) {
    String str="abc";
    t3.cc(str);
    System.out.println(str);
}  
}

输出结果:abc

结果分析
String属于引用类型,传递的参数就是字符串所在的地址的一个拷贝,而方法cc实际上只是将这个拷贝的值指向了另一个地址,原本的那个地址并没有受到影响。

对象类型
对象类型的结果和数组,String一样,在这里我就不分析了。

总结
无论是基本类型还是引用类型,在方法传参时,都有一个拷贝的过程。
基本数据类型传递的是值的一个拷贝
引用类型传递的是引用的一个拷贝
不管是值传递还是引用传递,形参拿到的仅仅是实参的副本,而不是实参本身。

回到最初的问题,java是值传递还是引用传递了?
这个就看怎么理解了,我也不好说,但无论是什么传递,我们只要记住,方法在传递参数时,拿到只是实参的一个拷贝就行了。

你可能感兴趣的:(Java解惑之值传递or引用传递)