一、什么是值传递
1、示例
我们首先用一个例子引出这个问题(后面会放出全部代码)
如下图代码,输出后a和b的值,以及张三李四会交换吗
我们直接给出结果:
结果一定是不会交换的
2、堆栈解析图
那么为什么他不会交换呢?我给大家画一下这段程序执行时堆栈的解析图
首先Main方法入栈,然后实例化a,b,我们不妨设10所在地址为1001,b所在地址为1002,然后让ab分别指向他们,然后change(a,b)方法入栈实例化abt
然后t =a ,a=b,b=t 也就是让t指向a(1001),a去指向b(1002),b指向t(1001)
然后change方法结束,change方法出栈
然后我们看到原本main方法中的a和b的指向并没有改变,所以我们再打印,值还是原来的值
我们再看张三和李四的情况:
还是change入栈,并让安排他们的指向
然后change方法出栈
还是并不影响原mian方法中2个对象的指向,所以打印出来依旧不变
那这是为什么别的对象并不能改变原对象的指向呢?
值传递传的是堆地址,引用传递是传栈中的地址
java 中只有值传递,没有引用传递
无论是基本类型和是引用类型,在实参传入形参时,都是值传递,也就是说传递的都是一个副本,而不是内容本身。
二、我们怎么才能向我们所想的那样直接改变他的值呢?
我们虽然不能改变原句柄的指向,但是我们可以改变他指向的对象的属性内容,如下图操作
这样,我们就可以直接改变他的值了
全部代代码如下:
class People{
String name;
int age;
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public People(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Transmit {
public static void main(String[] args) {
int a = 10;
int b = 100;
change(a,b);
System.out.println("a: "+a+" b: "+b);
People zhangsan = new People("张三",19);
People lisi = new People("李四",18);
change(zhangsan,lisi);
System.out.println("zhangsan: "+zhangsan);
System.out.println("lisi: "+lisi);
}
private static void change(int a, int b) {
int t = a;
a = b;
b = t;
}
private static void change(People zhangsan, People lisi) {
String temp = zhangsan.name;
zhangsan.name = lisi.name;
lisi.name = temp;
}
}
好了,这次的文章就到这里,喜欢的同学可以点赞收藏,遇到问题,可以评论,或者留言,我一定会第一时间给到回馈,感谢观看!!
注:本文为本人学习时心得分享,有讲错或者需要改正的地方,请指正,我会虚心接受