记一次值传递和引用传递题目总结

一、值传递
值传递也就是基本类型数据传递,当我们把一个基本类型数据a作为某个方法的参数的时候,相当于把a拷贝一个值作为这个方法的参数,方法内部的任何操作对原始值a没有任何影响,比如:

public static void main(String[] args) {
        int a = 0;
        System.out.println("a前值:"+a);
        change(a);
        System.out.println("a后值:"+a);

    }
    public static void change(int a){
        a= 1;
    }

执行代码:
在这里插入图片描述
发现change方法里面对a值进行了修改,只是对a的拷贝值进行了修改,只作用于当前方法域中,对main方法里面的a值没有任何影响

二、引用传递
引用传递也叫做引用对象地址的传递,就按照大家正常的想法来理解,当我们把一个对象B作为方法A的参数传递时,方法A内部对对象B的操作,会对对象B有影响吗?先看下面一个例子。

public static void main(String[] args) {
       User user = new User();
       user.setName("wgl");
        System.out.println("调用方法前对象user:"+user.toString());
        change(user);
        System.out.println("调用方法后对象user:"+user.toString());
    }
    public static void change(User u){
        u.setName("wxs");
    }

执行代码:
在这里插入图片描述
我们画图来分析一下:
在这里插入图片描述

步骤:
1、user拷贝了对象u
2、u和user指向同一个引用地址,u修改指向地址对应的内存值
3、u和user对象都发生了改变
总结:当对象user作为参数u传递给方法时,等于是把对象user拷贝了一份传递给了方法。user和u共同指向同一个内存地址。当方法内部对u进行修改时,修改了user、u共用地址所指向的内存值;

但是对于对象的赋值操作,采用=号形式时,我们可以看出来,对象的传递其实还是值传递
看下面代码:

public static void main(String[] args) {
       User user = new User();
       user.setName("wgl");
        System.out.println("调用方法前对象user:"+user.toString());
        change(user);
        System.out.println("调用方法后对象user:"+user.toString());
    }
    public static void change(User u){
        User newUser = new User();
        newUser.setName("wxs");
        u=newUser;
    }

执行结果:
在这里插入图片描述
发现user的值没有发生改变,对象传递不是引用传递吗;引用的是同一个地址,为什么对u进行修改,user却没有变化呢?我们画图展示下:
在这里插入图片描述
change方法的调用,其实是user拷贝了u对象,他们两个公共指向name=wgl的内存地址;
当我们new了个新对象newUser,把newUser赋值给u时,其实是把u的引用地址指向了name=wxs,而没有修改user的内存值。

综上所述,我们可以知道值传递和引用传递其实都是值拷贝的过程。只有修改了内存值,才会发生改变;而=号只是把数据的指针指向了新的地址。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值