`

java 值 引用

 
阅读更多

转自:http://www.iteye.com/topic/12961

 

问题:JAVA书里面说,"Java 是传值还是传引用,问题主要出在对象的传递上,因为 Java 中简单类型没有引用。

 

回答:

莫名其妙。现在的书 和 资料 怎么都是这样故意误导。在一些名词说法上绕圈子,而不从基本原理进行阐述。 
“传值和传引用”这个问题,我已经看到在多个地方,提出过多次了。这个问题的出现频率这么高,不能怪读者,主要是“概念制造者”的错。 

对于这个问题,如果学过汇编,那么就很容易从堆栈内存结构上理解。 
http://dev.csdn.net/article/17/17286.shtm 

所有的参数传递都是 传值,从来没有 传引用 这个事实。 
所有的参数传递都会在 程序运行栈上 新分配一个 值 的复制品. 

楼主的第一段代码。 

Java代码  收藏代码
  1. public static void test(Pass passA); {   
  2. passA.a="abc";   
  3. }   



这个传的 PassA 的 地址值。这个 地址值 被复制了一份。 
不信,你写: 

Java代码  收藏代码
  1. public static void test(Pass passA); {   
  2. passA = null;  
  3. }   



看看, 对passA有什么影响? 
毫无作用。函数调用出来后,passA还是原来的值,不会变成Null. 

但是,你的代码对 passA进行了操作  passA.a ,改变了passA的成员变量。 
这个成员变量是一个真实指向String 的 地址,当然能够被改变。 
这就是操作 (.)  和 赋值 (=) 的区别。 
这是对 成员变量 a 的 赋值。真正改变了成员变量 a 的值。 

注意,这里传递的参数是 passA, 而不是 a. 
所以,passA 被复制了一份。passA 的这个副本的 a 变量还 指向 原来的 passA 的 a 变量。 

楼主后面的代码, 

Java代码  收藏代码
  1. public static void test(String str); {   
  2. str = "World";   
  3. }   



只有对参数的 赋值,没有对参数的操作,当然不会产生影响。 

引用

public static void test(StringBuffer str) { 
str.append("World"); 



对参数进行了操作,当然会产生影响。 


--- 
另: 
同意“厌倦发呆”的意见。 
和我说的一个意思,只是表述重点有些区别。 

--- 
注: 
传引用,  只有一种语法现象. 
就是 C++的一种语法 
void function(int & a){ 
   a = 1; 


这个实际上编译为 
void function(int * a){ 
   *a = 1; 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics