#Java#我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种!


#Java#我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种!
文章图片
#Java#我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种!
文章图片
关于Java中方法间的参数传递到底是怎样的、为什么很多人说Java只有值传递等问题 , 一直困惑着很多人 , 甚至我在面试的时候问过很多有丰富经验的开发者 , 他们也很难解释的很清楚 。
我很久也写过一篇文章 , 我当时认为我把这件事说清楚了 , 但是 , 最近在整理这部分知识点的时候 , 我发现我当时理解的还不够透彻 , 于是我想着通过Google看看其他人怎么理解的 , 但是遗憾的是没有找到很好的资料可以说的很清楚 。
于是 , 我决定尝试着把这个话题总结一下 , 重新理解一下这个问题 。
辟谣时间关于这个问题 , 在StackOverflow上也引发过广泛的讨论 , 看来很多程序员对于这个问题的理解都不尽相同 , 甚至很多人理解的是错误的 。 还有的人可能知道Java中的参数传递是值传递 , 但是说不出来为什么 。
在开始深入讲解之前 , 有必要纠正一下大家以前的那些错误看法了 。 如果你有以下想法 , 那么你有必要好好阅读本文 。

错误理解一:值传递和引用传递 , 区分的条件是传递的内容 , 如果是个值 , 就是值传递 。 如果是个引用 , 就是引用传递 。
【#Java#我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种!】错误理解二:Java是引用传递 。
错误理解三:传递的参数如果是普通类型 , 那就是值传递 , 如果是对象 , 那就是引用传递 。
实参与形参我们都知道 , 在Java中定义方法的时候是可以定义参数的 。 比如Java中的main方法 , public static void main(String[
args) , 这里面的args就是参数 。 参数在程序语言中分为形式参数和实际参数 。
形式参数:是在定义函数名和函数体的时候使用的参数目的是用来接收调用该函数时传入的参数 。
实际参数:在调用有参函数时 , 主调函数和被调函数之间有数据传递关系 。 在主调函数中调用一个函数时 , 函数名后面括号中的参数称为“实际参数” 。
简单举个例子:
public static void main(String[
args) {
 ParamTest pt = new ParamTest();
 pt.sout(\"Hollis\");//实际参数为 Hollis

public void sout(String name) { //形式参数为 name
 System.out.println(name);

实际参数是调用有参方法的时候真正传递的内容 , 而形式参数是用于接收实参内容的参数 。
求值策略我们说当进行方法调用的时候 , 需要把实际参数传递给形式参数 , 那么传递的过程中到底传递的是什么东西呢?
这其实是程序设计中求值策略(Evaluation strategies)的概念 。
在计算机科学中 , 求值策略是确定编程语言中表达式的求值的一组(通常确定性的)规则 。 求值策略定义何时和以何种顺序求值给函数的实际参数、什么时候把它们代换入函数、和代换以何种形式发生 。
求值策略分为两大基本类 , 基于如何处理给函数的实际参数 , 分为严格的和非严格的 。
严格求值在“严格求值”中 , 函数调用过程中 , 给函数的实际参数总是在应用这个函数之前求值 。 多数现存编程语言对函数都使用严格求值 。 所以 , 我们本文只关注严格求值 。
在严格求值中有几个关键的求值策略是我们比较关心的 , 那就是传值调用(Call by value)、传引用调用(Call by reference)以及传共享对象调用(Call by sharing) 。