我报名参加金石计划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无法实现数据交换功能,其并没有改变存储在变量stuA和stuB中的对象引用。
在swap方法中参数x和y被初始化为两个对象引用的拷贝。因此交换的是这两个拷贝。也就是说,在方法调用结束时,x和y被销毁丢弃了,原来的对象变量仍然引用着方法调用前所引用的对象。
2.3、小结
综上所述,Java对对象采用的是值传递,而不是引用传递。
3️⃣写在最后
好了,今天的笔记就记到这里。