Javase复习--------到底要怎么解释为什么Java中只有值传递???

什么是值传递?

值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。


什么是参数传递?

引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

为什么Java只有值传递

记住,基本数据类型值传递中的值就是实际参数的实际值,比如int a=10,此时的值就是10;

复杂数据类型值传递中的值指的是实际参数的地址值,例如 User user作为参数调用的时候 ,传递的是它的地址值。

首先来看基本数据类型的值传递例子:

public class Test {
    public static void main(String[] args) {
       int b=10;
       change(b);
        System.out.println(b);//输出b=10;
    }
    public static void change(int a ){
        a=20;
    }
}

通过上面例子可以看出,在我们调用change()方法之后,b的值依然是10,这就是因为当我们在调用change方法的时候,只是将b的值拷贝了一份,然后将这个值赋值给了形参a,这样即使我们改变了a的值,主方法中的b依然也不会改变,这就是值传递。

下面是复杂数据类型的值传递

public class Test {
    public static void main(String[] args) {
        Student student=new Student();
        student.setAge(10);
        student.setName("sun");
        change(student);
        System.out.println(student.getName());
    }
    public static void change(Student student ){
      student.setName("zhangsan");
    }
}

上面这一段代码输出的结果是zhangsan,这时候很多小伙伴就困惑了,不是说Java只有值传递吗?为什么student的名字变成了zhangsan?还请往下看。

复杂数据类型值传递中的值指的是实际参数的地址值,例如 User user作为参数调用的时候 ,传递的是它的地址值。

也就是在传递的时候我们传递的值是地址值,并不是传递student这个对象的内容属性,所以在change方法里面修改了student的name属性,主方法student的name会改变的原因就是这样。

下面我们可以输出main方法中student的地址值来看看在调用change前后main方法的student的地址值是否有改变。

public class Test {
    public static void main(String[] args) {
        Student student=new Student();
        student.setAge(10);
        student.setName("sun");
        change(student);
        System.out.println(student.getName());
        System.out.println("主方法里面的student:"+student);
    }
    public static void change(Student student ){
        System.out.println("change里面的student:"+student);
      student.setName("zhangsan");
    }
}

输出结果:

在这里插入图片描述

可以看到student的地址值并没有改变,所以这就依然诠释了在Java的世界里,只有值传递,没有引用传递。我们可以改一下change方法里面student的地址值,看看main方法中的地址值是否有改变。

public class Test {
    public static void main(String[] args) {
        Student student=new Student();
        student.setAge(10);
        student.setName("sun");
        System.out.println("change方法调用前:"+student);
        change(student);
        System.out.println("change方法调用后:"+student);
    }
    public static void change(Student student ){
        student=new Student();
        System.out.println("change里面的student:"+student);
    }
}

输出结果:

在这里插入图片描述

以上是打算参加秋招的我复习Java基础时候做的笔记。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空圆小生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值