统计
  • 建站日期:2019-12-01
  • 文章总数:2002 篇
  • 评论总数:2124 条
  • 分类总数:21 个
  • 最后更新:11月21日
文章 未分类

为什么Java只有值传递?

程序员阿鑫
首页 未分类 正文

本文来源: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只有值传递?
-程序员阿鑫-带你一起秃头
-第1
张图片

首先我们要清楚,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只有值传递?
-程序员阿鑫-带你一起秃头
-第2
张图片

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

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

.

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

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

版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。
版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!

-- 展开阅读全文 --
这篇文章最后更新于2020-5-9,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
JAVA面向对象,记一次T1类和对象
« 上一篇
不错的小工具,批量取消关注wx公众号神器
下一篇 »