本文来源:CSDN小黑爱上排骨
尊重原创,从你我做起
我们先看一下值传递和引用传递的概念和区别
值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递:是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
值传递和引用传递的区别:
- 值传递会创建副本,引用传递不创建副本
- 值传递的函数中无法改变原始对象,引用传递中函数 可以改变原始对象
我们通过例子理解一下Java的值传递:
public static void main(String[] args) {
int a = 10;
int b = 20;
exchange(a,b);
System.out.println(a);
System.out.println(b);
Student a1 = new Student();
Student b1 = new Student();
a1.name = "张三";
b1.name = "李四";
System.out.println(a1);
System.out.println(b1);
exchange(a1,b1);
System.out.println(a1);
System.out.println(b1);
}
public static void exchange(int a, int b){
int c = a;
a = b;
b = c;
}
public static void exchange(Student a,Student b){
Student c = a;
a = b;
b = c;
}
public class Student {
public String name;
}
运行结果如图
调用方法前的a:10
调用方法前的b:20
调用方法后的a:10
调用方法后的b:20
调用方法前的a1:com.test.entity.Student@1540e19d
调用方法前的b1:com.test.entity.Student@677327b6
调用方法后的a1:com.test.entity.Student@1540e19d
调用方法后的b1:com.test.entity.Student@677327b6
首先我们要清楚,Java中的参数传递就是值传递,只不过普通类型传递的是复制后的值,而对象传递的就是地址值,只要不改变地址值,那么你在函数中对对象的操作就不会影响原来的对象。
上面的代码执行方法后,只是a` 指向李四, b’ 指向张三,并没有改变地址值,也没有改变其中的数据,所以在调用方法后,原来的对象不受影响。
我们再看一个迷惑性的例子
public static void main(String[] args) {
Student a1 = new Student();
Student b1 = new Student();
a1.name = "张三";
b1.name = "李四";
System.out.println("调用方法前的a1:" + a1);
System.out.println("调用方法前的b1:" +b1);
exchange(a1,b1);
System.out.println("调用方法后的a1:" +a1);
System.out.println("调用方法后的b1:" +b1);
}
public static void exchange(Student a,Student b){
Student c = new Student();
c.name = a.name;
a.name = b.name;
b.name = c.name;
}
与上面不同的是,为c开辟一个新的内存空间,运行结果如下:
1.对象的地址值变化情况:
调用方法前的a1:com.test.entity.Student@1540e19d
调用方法前的b1:com.test.entity.Student@677327b6
调用方法后的a1:com.test.entity.Student@1540e19d
调用方法后的b1:com.test.entity.Student@677327b6
2.参数变化情况
调用方法前的a1:name=张三
调用方法前的b1:name=李四
调用方法后的a1:name=李四
调用方法后的b1:name=张三
我们可以看到,a1和b1的地址值没有发生改变,但是a1和b1的参数互换了,这是为什么呢,看图解:
上面的例子其实也是值传递,把实参对象引用的地址当做值传递给了形参。只是地址中存储的参数值发生了变化。
总结:Java是值传递的,只不过对于对象参数,值的内容是对象的引用。
.
以上是《为什么Java只有值传递》文章的全部内容,感谢你的支持!
以上就是《为什么Java只有值传递》文章的全部内容了!
版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!