2021-03-21-Java中给方法传参的值传递机制详解

2023-05-16

可以结合我的另外一篇笔记观看,不足之处请评论指正,非常感谢.
https://blog.csdn.net/qq_46552655/article/details/114990628?spm=1001.2014.3001.5501

  1. 首先需要声明的是,Java中给方法形参传递值的机制是值传递。对,没有说错,就是值传递。
  2. 基本数据类型:给方法形参传递基本数据类型时是值传递,很容易理解。看图看代码:
public class BasicValueTransport {
    public static void main(String[] args) {
        int num1=10;
        int num2=20;
        swap(num1,num2);
        System.out.println(num1);   //10
        System.out.println(num2);   //20
    }

    public static void swap(int a,int b){
        int temp=a;
        a=b;
        b=temp;
        System.out.println(a);   //20
        System.out.println(b);   //10
    }
}

输出结果:

20
10
10
20

结果发现,仅方法内部两个形参的值发生了交换,而对于原来的数据num1和num2并没有影响.
这里传给形参a,b的值分别就是num1的拷贝和num2拷贝,所以在方法内部交换两个形参的值并不会影响原来数据的值,num1的值还是10,num2的值还是20.
在这里插入图片描述
3.引用数据类型: 那么传递引用数据类型的参数时是值传递还是引用传递?这个问题有极其普遍的误解现象,需要再次明确,这里仍旧是值传递,只不过传递的就是引用值拷贝(地址值的拷贝) .举例阐述:

public class ClassValueTest {
    public static void main(String[] args) {
        Person man = new Person(13);
        Person woman=new Person(22);
        swap(man,woman);
        System.out.println(man.getAge());     //13
        System.out.println(woman.getAge());   //22
    }

    public static void swap(Person a,Person b){
        Person temp=a;
        a=b;
        b=temp;
        System.out.println(a.getAge());   //22
        System.out.println(b.getAge());   //13
    }
}

结果:

22
13
13
22

假如是引用传递,则输出的结果应该如下,但事实不是这样

22
13
22
13

如果是引用传递,传递过程如下图:
在这里插入图片描述
按照上图的分析,如果是引用传递,则man和woman指向的地址发生了改变,即指向了另外一个对象,但从代码结果得知事实并不是这样的.

正确的理解为: 引用变量man和woman将拷贝的引用地址值传递给了形参,而这两个拷贝的地址值在方法中进行了交换,但并没有影响变量man和woman的的引用.如图:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2021-03-21-Java中给方法传参的值传递机制详解 的相关文章

随机推荐