是否是你所知的Java的值传递

Java中的值传递机制

首先,我们先看下面一张图了解一下Java中的数据类型
在这里插入图片描述
然后记住以下两点:

  1. 如果变量是基本数据类型,则此时赋值的是变量的数据值
  2. 如果变量是引用数据类型,则此时赋值的是变量的地址值

接下来脑海里带着这两点来看下面的代码块,通过代码来理解

public class Test {
    public void swap(int a, int b) {
        int temp = a;
        a = b;
        b = tmp;
        System.out.println("swap中的a:" + a + "==" + "b:" + b);//swap中的a:20==b:10
    }

    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        Test test = new Test();
        test.swap(a, b);
        System.out.println("main方法中的a:" + a + "==" + "b:" + b);//main方法中的a:10==b:20
    }
}

从打印的数据可以得知变量a,b的值并没有发生改变,而方法调用时的实参传递的是变量的数据值;这符合我们第一点所说的,接下来看变量是引用数据类型的,同样通过代码来帮助我们理解。

public class Test {
    class Data{
        int a;
        int b;
    }
    public static void main(String[] args) {
        Test test = new Test();
        test.start();
    }

    private void start() {
        Data data = new Data();
        data.a = 10;
        data.b = 20;
        System.out.println("数据交换前a:"+ data.a + "  ==  b:" + data.b);//数据交换前a:10  ==  b:20
        swap(data);
        System.out.println("数据交换后a:"+ data.a + "  ==  b:" + data.b);//数据交换后a:20  ==  b:10
    }

    private void swap(Data data) {
        int temp = data.a;
        data.a = data.b;
        data.b = temp;
    }
}

当数据传递的是引用数据类型的时候,传递的是它保存数据的地址值,也就是当变量是引用类型的时候,赋值是赋它的地址值。

注意

看下面代码块

public class Test {
    public static void main(String[] args) {
        String str = "a";
        Test test = new Test();
        test.swap(str);
        System.out.println("main方法中的"+str);//main方法中的str:a
    }

    private void swap(String str) {
        str = "b";
        System.out.println("swap方法中的"+str);//swap方法中的str:b
    }
}

可以知道的是String是引用数据类型,但我们发现变量的值并没有发生改变,是不是说明传的不是变量的地址值?
String是一个字符串常量,也就是它的值是不可变的,当我们把值传过去的时候,传的确实是它的地址值,这时他们指向同一个地址,而当给它赋以新值的时候,它会重新创建一个新的char[],再把新的地址值赋给变量,此时也就指向了两个不同的地址,因此值也不相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值