@
wysnylc 我觉得还是从字面上来讲比较好一点.
中文 英文
传值 pass by value
传引用 pass by reference
这里的中文表达并没有清晰地传递英语原意. 更准确地将应该是:
按照值方式传递函数形参 - 有拷贝发生
按照引用方式传递函数形参 - 无拷贝发生
你刚刚引用的 java-pass-by-value-or-pass-by-reference 中有下面一段话
A Java object, in contrast to Primitives, is stored in two stages. The reference variables are stored in stack memory and the object that they're referring to, are stored in a Heap memory.
Whenever an object is passed as an argument, an exact copy of the reference variable is created which points to the same location of the object in heap memory as the original reference variable.
上面第一部分将 Java 存放引用类型的机制说明地很清楚, 引用变量存储的是引用类型数据的内存地址, 也就是说变量本身的值就是引用类型数据的指针. 正因为如此, 传递引用变量的时候对值做了拷贝, 你将引用类型数据的地址通过值传递(拷贝)进了函数形参, 所以你可以操作这个引用类型数据, 但引用本身是没有传递进函数的, 因此我上面的 swapnum 函数不可能交换数据. 这个机制在第二部分说明的很清楚. 你上面说没有交换是因为他们是基本类型, 这个说法完全不正确, 因为在我上面的代码中我使用的是 Integer 而不是 int, 基本类型的包装类型, 即引用对象类型.
另一方面讲, 中文的表达 "传值" 和 "传引用" 也有 "传递值到函数形参" 和 "传递对象引用到函数形参" 的味道, 这个可能是中文传值, 传引用容易引起误解的部分原因吧.