码迷,mamicode.com
首页 > 编程语言 > 详细

Java 值传递、引用传递之争

时间:2020-04-26 17:02:18      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:amp   消失   @param   顺序   rgs   fda   ram   sys   val   

Java 就是值传递

  • 解决此问题之前也介绍形式参数和实际参数的区别

形式参数/实际参数

  • 形式参数指用于接收函数被调用时候传入的实际参数
  • 实际参数指调用有参函数时传入的实际内容

代码示例:

    public static void main(String[] args) {
        int a = 1;

        setValue(a);// 此处的 a 看作实际参数

        System.out.println(a);
    }

    /**
     * 此处的 a 看做形式参数
     * @param a
     */
    public static void setValue(int a){
        System.out.println(a);
    }

求值策略

求值策略定义何时和以何时顺序求值给函数的实际参数,什么时候代换入函数和代换以何种方式进行
求值策略分为:

  • 严格求值
  • 非严格求值

严格求值

  • 值传递
  • 引用传递
  • 共享对象传递

值传递

  • 值传递就是实际参数再调用函数之前先被求值,其值被复制,复制后的值再传递给形式参数。因此形式参数再函数方法体内修改是不会影响原实际参数的值。

引用传递

  • 引用传递传给函数是引用类型实际参数的隐士引用而非实参的拷贝。所以,在被调函数中改变形式参数的值,改变对于调用者来说是可见的

共享对象传递

  • 传共享对象调用中,先获取实际参数的地址,然后将其复制,并将该地址的拷贝传给被调用函数的形式参数,所以共享传递对象也是值传递

实际也是将引用类型对应的JVM 堆中的地址传给函数

原始参数通过值传递给方法。这意味着对参数值的任何更改都只存在于方法的范围内。当方法返回时,参数将消失,对参数的任何更改都将丢失。

引用数据类型参数(如对象)也按值传递给方法。这意味着,当方法返回时,传入的引用仍然引用与以前相同的对象。但是,如果对象字段具有适当的访问级别,则可以在方法中更改这些字段的值

Java对象的传递,是通过复制的方式把引用关系传递了,如果我们没有改引用关系,而是找到引用的地址,把里面的内容改了,是会对调用方有影响的,因为大家指向的是同一个共享对象。

原文链接:

https://mp.weixin.qq.com/s?__biz=MzI3NzE0NjcwMg==&mid=2650127218&idx=1&sn=f33a8f28e348519497921e074a01b758&chksm=f36ba653c41c2f453a1bef3715f22e07951586f12a2d9cf1f806585ced790dad7ea4968fae50&scene=126&sessionid=1587346265&key=b1620055a7dc55280ab0b9052af4ef61bf7ddb9849005e136b1e699119f8a0bd718f1c77de56c252fad3c3ae67fec04efda49111e2157725a532b3036ca7f869f62c5236589810009435ef738d6b96c1&ascene=1&uin=Nzg4NzczNTIw&devicetype=Windows+10&version=62080079&lang=zh_CN&exportkey=AWhm2mdQzoh4r%2FV0Gb2RVrQ%3D&pass_ticket=vRxYHUdS2f5BIaQ2z53IaeK97onMGSi3jAWc6tkJEEs8nbdAR%2BXCL9toPo%2Fw3J5e

Java 值传递、引用传递之争

标签:amp   消失   @param   顺序   rgs   fda   ram   sys   val   

原文地址:https://www.cnblogs.com/blackBlog/p/12780405.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!