值传递、引用传递

2021-06-25  本文已影响0人  莫生人

    关于Java中方法间的参数传递到底是怎样的、为什么很多人说Java只有值传递等问题,一直困惑着很多人,甚至很多有丰富经验的开发者,他们也很难解释的很清楚。
    关于这个问题,在StackOverflow上也引发过广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同,甚至很多人理解的是错误的。还有的人可能知道Java中的参数传递是值传递,但是说不出来为什么。
    在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了。如果你有以下想法,那么你有必要好好阅读本文。

实参与形参

    我们都知道,在Java中定义方法的时候是可以定义参数的。比如Java中的main方法,public static void main(String[] args),这里面的args就是参数。参数在程序语言中分为形式参数和实际参数。

求值策略

    我们说当进行方法调用的时候,需要把实际参数传递给形式参数,那么传递的过程中到底传递的是什么东西呢?这其实是程序设计中求值策略(Evaluation strategies)的概念。
    在计算机科学中,求值策略是确定编程语言中表达式的求值的一组(通常确定性的)规则。求值策略定义何时和以何种顺序求值给函数的实际参数、什么时候把它们代换入函数、和代换以何种形式发生。
    求值策略分为两大基本类,基于如何处理给函数的实际参数,分为严格的和非严格的。

严格求值

    在“严格求值”中,函数调用过程中,给函数的实际参数总是在应用这个函数之前求值。多数现存编程语言对函数都使用严格求值。所以,我们本文只关注严格求值。
    在严格求值中有几个关键的求值策略是我们比较关心的,那就是传值调用(Call by value)、传引用调用(Call by reference)以及传共享对象调用(Call by sharing)。

pass-by-reference-vs-pass-by-value-animation.gif

    所以,两者的最主要区别就是是直接传递的,还是传递的是一个副本。

    举一个形象的例子。再来深入理解一下传值调用和传引用调用:
    你有一把钥匙,当你的朋友想要去你家的时候,如果你直接把你的钥匙给他了,这种情况下,如果他对这把钥匙做了什么事情,比如他在钥匙上刻下了自己名字,那么这把钥匙还给你的时候,你自己的钥匙上也会多出他刻的名字,这就是引用传递。你有一把钥匙,当你的朋友想要去你家的时候,你复刻了一把新钥匙给他,自己的还在自己手里,这种情况下,他对这把钥匙做什么都不会影响你手里的这把钥匙,这就是值传递。
    前面我们介绍过了传值调用、传引用调用以及传值调用的特例传共享对象调用,那么,Java中是采用的哪种求值策略呢?

上一篇 下一篇

猜你喜欢

热点阅读