转自:http://www.iteye.com/topic/12961
问题:JAVA书里面说,"Java 是传值还是传引用,问题主要出在对象的传递上,因为 Java 中简单类型没有引用。
回答:
莫名其妙。现在的书 和 资料 怎么都是这样故意误导。在一些名词说法上绕圈子,而不从基本原理进行阐述。
“传值和传引用”这个问题,我已经看到在多个地方,提出过多次了。这个问题的出现频率这么高,不能怪读者,主要是“概念制造者”的错。
对于这个问题,如果学过汇编,那么就很容易从堆栈内存结构上理解。
http://dev.csdn.net/article/17/17286.shtm
所有的参数传递都是 传值,从来没有 传引用 这个事实。
所有的参数传递都会在 程序运行栈上 新分配一个 值 的复制品.
楼主的第一段代码。
- public static void test(Pass passA); {
- passA.a="abc";
- }
这个传的 PassA 的 地址值。这个 地址值 被复制了一份。
不信,你写:
- public static void test(Pass passA); {
- passA = null;
- }
看看, 对passA有什么影响?
毫无作用。函数调用出来后,passA还是原来的值,不会变成Null.
但是,你的代码对 passA进行了操作 passA.a ,改变了passA的成员变量。
这个成员变量是一个真实指向String 的 地址,当然能够被改变。
这就是操作 (.) 和 赋值 (=) 的区别。
这是对 成员变量 a 的 赋值。真正改变了成员变量 a 的值。
注意,这里传递的参数是 passA, 而不是 a.
所以,passA 被复制了一份。passA 的这个副本的 a 变量还 指向 原来的 passA 的 a 变量。
楼主后面的代码,
- public static void test(String str); {
- str = "World";
- }
只有对参数的 赋值,没有对参数的操作,当然不会产生影响。
public static void test(StringBuffer str) {
str.append("World");
}
对参数进行了操作,当然会产生影响。
---
另:
同意“厌倦发呆”的意见。
和我说的一个意思,只是表述重点有些区别。
---
注:
传引用, 只有一种语法现象.
就是 C++的一种语法
void function(int & a){
a = 1;
}
这个实际上编译为
void function(int * a){
*a = 1;
}
相关推荐
Java:按值传递还是按引用传递详细解说
java 值传递和引用传递的比较区别,包括代码及详解
不管是按值传递还是按引用传递,都是把栈中的数据备份了一份给参数变量,只不过值类型备份的是具体的数值,而引用类型备份的是内存地址
这个在Java里面是经常被提起的问题,也有一些争论,似乎最后还有一个所谓的结论:“在Java里面参数传递都是按值传递”。事实上,这很容易让人迷惑,下面先分别看看什么是按值传递,什么是按引用传递,只要能正确理解...
Java面向对象值传递和引用传递Java面向对象值传递和引用传递Java面向对象值传递和引用传递Java面向对象值传递和引用传递
主要介绍了java中关于对象作为参数传的时候倒是什么时候是值专递还是传引用
java学习java语言的值传递和引用传递
当一个变量为一个参数传入方法内部的时候,会有两种不同的传递方式:值传递和引用传递。 值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值 引用传递的特点:方法内部对传...
值类型和引用类型的区别: 似乎“值类型和引用类型的区别”是今年面试的流行趋势,我已然是连续三次(目前总共也就三次)面试第一个问题就遇到这个了,这是多大的概率啊,100%. 言归正传,咱还是先来探讨探讨这二者...
主要介绍了 Java 值传递和引用传递详解及实例代码的相关资料,需要的朋友可以参考下
本人经过长时间收集的最经典、最有说服力、最易懂的关于值传递和引用传递的详解资料~包看包会~发出去真有些不舍得~
Java的按值传递和按引用传递分析 Java的按值传递和按引用传递分析.pdf
结果,就像光到底是波还是粒子的问题一样,Java 方法的参数是按什么传递的问题,其答案就只能是:即是按值传递也是按引用传递,只是参照物不同,结果也就不同。 4. 正确看待传值还是传引用的问题 要正确的...
java旺旺老师_按值传参与与按引用传参
NULL 博文链接:https://dracularking.iteye.com/blog/682251
Java的按值传递和按引用传递分析.rar
java 中没有引用传递,都是值传递的,可以通过传递副本修改对象的,副本交换,并不影响原引用
Java中的值传递和引用传递的区别.doc
Java语言中参数值传递和引用传递比较