美文网首页
Java解惑之值传递or引用传递

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

作者: sofarsogoo_932d | 来源:发表于2018-03-31 20:35 被阅读0次

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

    基本数据类型

    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引用传递

          本文链接:https://www.haomeiwen.com/subject/iikncftx.html