Java之引用传递

发布时间 2023-10-06 12:44:28作者: Melo70000

引用传递分析

类本身就属于引用数据类型,既然是引用数据类型,就会牵扯到内存的引用传递。

引用传递的本质:同一块堆内存空间可以被不同的栈内存所指向,也可以变更指向。

引用传递案例

先看一个应用传递的例子:

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实际上保存的一条内存地址,而上述语句怎表明新的栈内存空间per2per1保存一样的内存地址。

当我执行语句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);部分,如下图

此时原本栈内存都是主方法的per1per2,现在变成了主方法的perchange()方法的temp

最后执行change()

但是当change()执行完毕是,temp会断开连接

最后,当我们引用传递发生在方法上,主要关注方法接收的参数类型方法的执行位置