一文讲懂引用传递与值传递

引言

之前上学的时候我一直把值传递和引用传递想简单了,比如方法中只要是传了对象类型那就算引用传递、传了值类型就算引用传递。没想到今天在项目上吃了亏、遇到了要绑定地址的方法。
接下来为正式讲解:

以常见的Java语言为例,JAVA只有值传递无引用传递
对象、数组的传递是复制引用的值传递

值传递

可以改变方法外传递的对象的成员、无法更改方法外传递对象的地址;不能改变方法外的地址

可以

可以更改引用(地址)的属性
(因为方法内操作对象,相当于操作方法外的同地址对象、同个地址)
可以更改数组中指定位置的元素为新的元素,传递数组原先值0(a[0]=0),方法内改变1(a[0]=1),方法外也为1(a[0] ==1)。
(因为方法内传递了数组的地址值,方法内操作数组相当于操作方法外的数组、同个地址)

无法

无法更改基本类型的值(因为传递的不是地址、没有操作传递过来地址的成员)
无法更改原先引用指向的对象(无法指向同类型新的对象、且原先类型不会发生变化、原先的地址不会变)
无法更改原先引用的地址(不能释放地址、地址不能设定为null)

引用改地址的样例

public static void main(String[] args) {
    Person xiaoZhang = new Person("小张");
    Person xiaoLi = new Person("小李");
    swap(xiaoZhang, xiaoLi);
    System.out.println("xiaoZhang:" + xiaoZhang.getName());
    System.out.println("xiaoLi:" + xiaoLi.getName());
}
//方法内改变方法外引用地址(交换两个引用地址),方法外引用地址不变
public static void swap(Person person1, Person person2) {
    Person temp = person1;
    person1 = person2;
    person2 = temp;
    System.out.println("person1:" + person1.getName());
    System.out.println("person2:" + person2.getName());
}

/**
*person1:小李
*person2:小张
*xiaoZhang:小张
*xiaoLi:小李
*/

引用传递

C#(混合传递 值传递、in用于保留引用传递不复制副本节省空间功能的只读的引用传递、 out方法外参数无需初始化的引用传递、ref需要初始化的引用传递)、
C++为引用传递,可以改变方法外传递的对象的成员、可以更改方法外传递对象的地址

·可以更改方法外基本类型的值
·可以让原先引用指向同类型新的对象、以及新的类型
·可以释放地址(空间不释放、只是地址指向位置变为了null)

posted @ 2025-08-12 23:24  已宕机  阅读(22)  评论(0)    收藏  举报