引用传递分析
类本身就属于引用数据类型,既然是引用数据类型,就会牵扯到内存的引用传递。
引用传递的本质:同一块堆内存空间可以被不同的栈内存所指向,也可以变更指向。
引用传递案例
先看一个应用传递的例子:
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+ name + " 年龄:" + age);
}
}
public class JavaDemo{
public static void main(String args[]){
Person per1 = new Person(); //实例化
per1.name = "张三";
per1.age = 18;
Person per2 = per1; //引用传递
per2.age = 80;
per1.tell(); //进行方法调用
}
}
运行结果:
对代码进行分析:
首先是实例化对象per1以及赋值,这个较好理解
关键的一条语句:Person per2 = per1;
因为我们知道,per1
实际上保存的一条内存地址,而上述语句怎表明新的栈内存空间per2
和per1
保存一样的内存地址。
当我执行语句per2.age = 80;
的时候,实际上修改原本控件的age值
方法进行引用传递
这个时候的引用传递是直接在主方法进行的,也可以使用方法进行引用传递。
沿用上面例子我们做个修改:
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+ name + " 年龄:" + age);
}
}
public class JavaDemo{
public static void main(String args[]){
Person per = new Person(); //实例化
per.name = "张三";
per.age = 18;
change(per);
per1.tell(); //进行方法调用
}
public static void change(Person temp)
temp.age = 80;
}
与之前的差别最大的地方在于,此处程序是将Person类的实例化对象(内存地址和数值)传递到方法change()方法中。
但是大家不要被迷惑了,此时运行结果还是和上述一样。这是因为change(per);
就等价于Person temp = per;
从图上来说,实例化部分的图是一样的,而到change(per);
部分,如下图
此时原本栈内存都是主方法的per1
和per2
,现在变成了主方法的per
和change()
方法的temp
最后执行change()
但是当change()执行完毕是,temp会断开连接
最后,当我们引用传递发生在方法上,主要关注方法接收的参数类型和方法的执行位置。