好问题,Java究竟属于值传递还是引用传递?

105 阅读2分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情

1️⃣前言

大家好,我是翼同学。今天笔记的内容是:

  • Java究竟是值传递还是引用传递?

2️⃣内容

2.1、参数传递方式

一般来说,参数传递的方法有两种:

  • 值传递:方法接收的是具体值,调用方法时会拷贝一份实际参数并传递到方法中。此时即使在方法中对参数进行修改也不会影响到实际参数
  • 引用传递:方法接收的是变量地址,调用方法时会将实际参数的地址传递到方法中,此时修改参数会影响到实际参数

2.2、Java举例

对于Java来说,参数传递方式到底是值传递还是引用传递?这个问题其实无官方答案。具体来看两个例子。

例子一

我们先来看第一个例子:

public void myTest() {
    int data = 1;
    change(data);
    System.out.println(data);  //=> 1
}
private void change(int data) {
    data = data + 1;
}

可以看到,变量data的值并没有改变,依旧是1

当调用change()方法时,传递的其实是变量data值的拷贝,而不是真正的data,因此data的值其实并没有改变。

例子二

再来看一个例子:

public class Test {
    public static void main(String[] args) {
        Student stuA = new Student();
        Student stuB = new Student();
        stuA.setId(1);
        stuB.setId(2);
        System.out.println("学生A的id号为:"+ stuA.getId() +",学生B的id号为:"+stuB.getId());
        Student.swap(stuA,stuB);
        System.out.println("交换后:\n学生A的id号为:"+ stuA.getId() +",学生B的id号为:"+stuB.getId());
    }
}

class Student {
    // 构造器
    Student(){
        id = 0;
    }
    // 更改器
    public void setId(int val){
        id = val;
    }
    // 访问器
    public int getId() {
        return id;
    }
    // swap方法
    public static void swap(Student x, Student y){
        Student temp = x;
        x = y;
        y = temp;
    }
    // 私有属性 id
    private int id;
}

输出结果为:

学生A的id号为:1,学生B的id号为:2
交换后:
学生A的id号为:1,学生B的id号为:2

由输出结果可知,该交换方法swap无法实现数据交换功能,其并没有改变存储在变量stuAstuB中的对象引用。

swap方法中参数xy被初始化为两个对象引用的拷贝。因此交换的是这两个拷贝。也就是说,在方法调用结束时,xy被销毁丢弃了,原来的对象变量仍然引用着方法调用前所引用的对象。

2.3、小结

综上所述,Java对对象采用的是值传递,而不是引用传递。

3️⃣写在最后

好了,今天的笔记就记到这里。