为什么Java只有值传递?

2023-04-17 0 384

本文来源:CSDN小黑爱上排骨

尊重原创,从你我做起

我们先看一下值传递和引用传递的概念和区别
值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递:是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

值传递和引用传递的区别:

  1. 值传递会创建副本,引用传递不创建副本
  2. 值传递的函数中无法改变原始对象,引用传递中函数 可以改变原始对象

我们通过例子理解一下Java的值传递:

 public static void main(String[] args) {
        int a = 10;
        int b = 20;
        exchange(a,b);
        System.out.println(a);
        System.out.println(b);
        Student a1 = new Student();
        Student b1 = new Student();
        a1.name = \"张三\";
        b1.name = \"李四\";
        System.out.println(a1);
        System.out.println(b1);
        exchange(a1,b1);
        System.out.println(a1);
        System.out.println(b1);
    }
    public static void exchange(int a, int b){
        int c = a;
        a = b;
        b = c;
    }
    public static void exchange(Student a,Student b){
        Student c = a;
        a = b;
        b = c;
    }

public class Student {
    public String name;
}

运行结果如图

调用方法前的a:10
调用方法前的b:20
调用方法后的a:10
调用方法后的b:20
调用方法前的a1:com.test.entity.Student@1540e19d
调用方法前的b1:com.test.entity.Student@677327b6
调用方法后的a1:com.test.entity.Student@1540e19d
调用方法后的b1:com.test.entity.Student@677327b6

为什么Java只有值传递?

首先我们要清楚,Java中的参数传递就是值传递,只不过普通类型传递的是复制后的值,而对象传递的就是地址值,只要不改变地址值,那么你在函数中对对象的操作就不会影响原来的对象。
上面的代码执行方法后,只是a` 指向李四, b’ 指向张三,并没有改变地址值,也没有改变其中的数据,所以在调用方法后,原来的对象不受影响。
我们再看一个迷惑性的例子

public static void main(String[] args) {

        Student a1 = new Student();
        Student b1 = new Student();
        a1.name = \"张三\";
        b1.name = \"李四\";
        System.out.println(\"调用方法前的a1:\" + a1);
        System.out.println(\"调用方法前的b1:\" +b1);
        exchange(a1,b1);
        System.out.println(\"调用方法后的a1:\" +a1);
        System.out.println(\"调用方法后的b1:\" +b1);
    }
    public static void exchange(Student a,Student b){
        Student c = new Student();
        c.name = a.name;
        a.name = b.name;
        b.name = c.name;
    }

与上面不同的是,为c开辟一个新的内存空间,运行结果如下:
1.对象的地址值变化情况:

调用方法前的a1:com.test.entity.Student@1540e19d
调用方法前的b1:com.test.entity.Student@677327b6
调用方法后的a1:com.test.entity.Student@1540e19d
调用方法后的b1:com.test.entity.Student@677327b6

2.参数变化情况

调用方法前的a1:name=张三
调用方法前的b1:name=李四
调用方法后的a1:name=李四
调用方法后的b1:name=张三

我们可以看到,a1和b1的地址值没有发生改变,但是a1和b1的参数互换了,这是为什么呢,看图解:

为什么Java只有值传递?

上面的例子其实也是值传递,把实参对象引用的地址当做值传递给了形参。只是地址中存储的参数值发生了变化。

总结:Java是值传递的,只不过对于对象参数,值的内容是对象的引用。

.

以上是《为什么Java只有值传递》文章的全部内容,感谢你的支持!

以上就是《为什么Java只有值传递》文章的全部内容了!

为什么Java只有值传递?
下一篇:

已经没有下一篇了!

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务