Java值传递随笔


1.值传递和引用传递的基本概念

按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。 它用来描述各种程序设计语言(不只是 Java)中方法参数传递方式。

Java 程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝,也就是说,方法不能修改传递给它的任何参数变量的内容。


作者:JavaGuide
链接:https://juejin.im/post/5e18879e6fb9a02fc63602e2
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2.当传递的值是引用数据类型时,就可以把它看成遥控器

Demo1

 public static void main(String[] args) {
        Student s1 = new Student("张三");
        Student s2 = new Student("李四");
        Demo1.swap(s1,s2);
        System.out.println("-------main------");
        System.out.println("s1:"+s1.getName());
        System.out.println("s2:"+s2.getName());
    }
    public static void swap(Student x,Student y){
        Student temp = null;
        temp = x;
        x = y;
        y = temp;
        System.out.println("x:"+x.getName());
        System.out.println("y:"+y.getName());
    }

答案是多少呢?先不要点开,自己想想。

x:李四
y:张三
-------main------
s1:张三
s2:李四

理解方式:

s1,s2 是两个遥控器,分别控制两台电视机 S1和S2(随便起个名,便于理解);

修改name属性,可以理解为换台;

现在S1播放着"张三",S2播放着"李四"。

swap()方法,相当于拷贝s1、s2,做了复制遥控器x,y——x控制S1,y控制S2。

简单来说,每个学生对象,都存在着两个引用。

经过交换,x控制S2,y控制S1。

因为这俩遥控器只是s1、s2的拷贝,不是本体,所以对s1、s2没有任何影响。

因为没有换台的操作,所以对S1、S2没有任何影响。

所以,主函数时打印name时,岁月静好,什么都没有改变。

Demo2

    public static void main(String[] args) {
        Student s1 = new Student("张三");
        Student s2 = new Student("李四");
        Demo2.swap(s1,s2);
        System.out.println("-------main------");
        System.out.println("s1:"+s1.getName());
    }
    public static void swap(Student x,Student y){
        x.setName("王二麻子");
        System.out.println("x:"+x.getName());
    }

结果是

x:王二麻子
-------main------
s1:王二麻子

理解方式:

虽然x只是一个复制品,但是它确实能遥控电视机S1。

理解了Demo1和Demo2,那么Demo3和Demo4就很简单了,答案直接给出。

Demo3

 Demo4

相关