1. 基本数据类型

public class ValueTransferTest {
    public static void main(String[] args) {
        int m = 10;
        int n = 20;

        System.out.println("交换前:");
        System.out.println("m = " + m + ", n = " + n);

        ValueTransferTest test = new ValueTransferTest();
        
        test.swap(m, n);

        System.out.println("交换后:");
        System.out.println("m = " + m + ", n = " + n);
    }

    public void swap(int m, int n) {
        int temp = m;
        m = n;
        n = temp;
    }
}

结果

交换前:
m = 10, n = 20
交换后:
m = 10, n = 20

原因

  • 如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值
  • 就是说,当在main方法里把实参传递给swap方法后,在swap方法里是交换了m,n的值,但是main方法里的m,n并没有变,因为没有改变main方法中变量存储的数据值
    img

2. 引用数据类型

package com.gzl;

public class ValueTransferTest {
    public static void main(String[] args) {
        Data data = new Data();

        data.m = 10;
        data.n = 20;

        System.out.println("交换前:");
        System.out.println("m = " + data.m + ", n = " + data.n);
        
        ValueTransferTest test = new ValueTransferTest();

        test.swap(data);

        System.out.println("交换后:");
        System.out.println("m = " + data.m + ", n = " + data.n);
    }

    public void swap(Data data) {
        int temp = data.m;
        data.m = data.n;
        data.n = temp;
    }
}

class Data {
    int m;
    int n;
}

结果

交换前:
m = 10, n = 20
交换后:
m = 20, n = 10

原因

  • data变量存储的是Data对象的引用(地址),而m和n保存在对象内,无论是实参data还是形参data,都是指向同一个对象,因此修改的也是同一个对象。
    img

3. 总结

  • 如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值
  • 如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值
posted on 2022-12-10 16:26  Cheyaoyao  阅读(29)  评论(0编辑  收藏  举报