java的值传递

众所周知,java是使用值传递的调用方法得到的是参数值的一个拷贝**,也就是说,方法不能修改传递给它的任何参数变量的内容。除了值传递,还有引用传递,指针传递。引用传递可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值1
来看一下这段代码:

public class test {
    public static void main(String[] arg){
        int a = 1;
        int b = 2;
        swap2(a,b);
        System.out.println(a+" "+b);
        student s1 = new student("小李");
        student s2 = new student("小花");
        //swap(s1,s2);
        change(s1);
        System.out.println(s1.getName());
        System.out.println(s2.getName());
    }
    public static void swap2(int a,int b) {
        int temp = a;
        a = b;
        b = temp;
        System.out.println(a + " " + b);
    }
}

输出的结果是:

2 1
1 2

证明在 swap2 方法中,只对基本类型的拷贝进行了交换,并没有修改原来的基本类型的参数。
但是,如果而对象引用作为参数,结果就会发生变化,因为对象引用的拷贝和对象引用指向的是同一个对象。
还是用代码来解释

public class test {
    public static void main(String[] arg){
        student s1 = new student("小李");
        System.out.println(s1.getName());
        change(s1);
        System.out.println(s1.getName());
    }
    public static void change(student s1){
        System.out.println("使用改名卡");
        s1.setName("靓仔");
    }
}
class student{
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private String name;
    public student(String name){
        this.name = name;
        }
}

输出的结果是:

小李
使用改名卡
靓仔

是不是有点懵了,那再来看一段代码

public class test {

    public static void main(String[] arg){
        student s1 = new student("小李");
        student s2 = new student("小花");
        System.out.println(s1.getName());
        System.out.println(s2.getName());
        swap(s1,s2);
//        change(s1);
		System.out.println("-----------------------------------------");
        System.out.println(s1.getName());
        System.out.println(s2.getName());
    }
    public static void swap(student s1,student s2){
        student temp = s1;
        s1 = s2;
        s2 = temp;
        System.out.println("使用交换卡");
        System.out.println(s1.getName());
        System.out.println(s2.getName());
    }
}

输出结果是:

小李
小花
使用交换卡
小花
小李
-----------------------------------------
小李
小花

对比一下,发现改名卡是有用的,但是交换卡没有用,这是为什么呢?
其实,改名卡有用的理由前面已经解释过了,再强调一次:
但是,如果而对象引用作为参数,结果就会发生变化,因为对象引用的拷贝和对象引用指向的是同一个对象。
交换卡的解释可以参看下面这张图:
Alt
左图是使用改名卡之前的情况,而右图是使用改名卡之后的。“改名卡”并没有对堆内的内容进行修改,而只是交换了引用,而这个引用,是拷贝的。


  1. https://juejin.im/post/5e18879e6fb9a02fc63602e2 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值