`

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; 

分享到:
评论

相关推荐

    Java:按值传递还是按引用传递详细解说

    ### Java中的按值传递与按引用传递详解 #### 一、引言 在Java编程语言中,关于参数传递的方式一直存在两种观点:一种认为Java仅支持按值传递,另一种则指出Java同时支持按值传递和按引用传递。实际上,这两种观点...

    java 值传递和引用传递的比较

    在Java编程语言中,了解值传递和引用传递的概念至关重要,因为它们直接影响到函数参数的处理方式。下面将详细探讨这两个概念及其区别。 首先,我们来理解什么是值传递。在Java中,基本数据类型(如int、double、...

    java值传递与引用传递

    在Java编程语言中,函数参数的传递方式有两种:值传递和引用传递。理解这两种机制对于编写高效、无误的代码至关重要。以下是对这两种传递方式的详细解析。 首先,值传递是指函数调用时,实际参数的值被复制一份传给...

    Java的引用和函数参数传递

    ### Java的引用与函数参数传递详解 #### 一、Java中的引用基础 在Java中,对象的引用扮演着类似于其他编程语言(如C/C++)中指针的角色,但是Java的引用比传统的指针更加安全且易于管理。这是因为Java的设计者们...

    Java中的基本类型和引用类型变量的区别

    Java 中的基本类型和引用类型变量的区别 Java 中的基本类型和引用类型变量是两个不同的概念,它们在内存分配、变量赋值和函数传递等方面有着本质的区别。 基本类型是 Java 中的八种基本类型,包括 byte、short、...

    java中的引用问题

    对于基本类型,Java采用值传递的方式,而对于引用类型,则是传递引用的副本。 1. 值传递与引用传递的区别: - **值传递**:当传递基本类型参数时,实际传递的是该变量的值的一个拷贝。例如,对于一个布尔值`...

    值引用与对象引用

    ### 值引用与对象引用 #### 一、引言 在编程中,变量的引用方式分为两大类:值引用(Value Reference)和对象引用(Object Reference)。这两种引用方式决定了程序如何处理数据以及数据的存储方式。理解这些概念...

    Java是值传递,传对象引用也是通过值

    标题“Java是值传递,传对象引用也是通过值”揭示了Java中参数传递的核心概念。Java总是以值传递方式进行,这意味着当你将一个变量作为参数传递给方法时,传递的是该变量所存储值的一个副本。然而,对于对象类型的...

    java值传递和引用传递详解

    Java中的参数传递方式主要有两种:值传递和引用传递。理解这两种机制是编程中至关重要的,因为它们直接影响到函数内部如何改变或操作传入的数据。 **值传递**在Java中是基本数据类型(如int, double, char等)的...

    Java对象及其引用的理解

    本文将深入探讨Java中的对象、引用以及它们之间的关系,并结合值传递的概念进行解析。 首先,我们需要理解什么是Java对象。在Java中,对象是类的实例。当我们使用`new`关键字创建一个类的实例时,就创建了一个对象...

    java弱引用

    在 testCommon 方法中,我们首先输出了 a 和 b 的值,然后将 a 设置为 null,这样 a 就没有强引用指向了。然后,我们调用了 System.gc() 方法来请求垃圾回收器回收对象。在输出结果中,我们可以看到,b 中的弱引用 ...

    java值拷贝

    在Java编程中,值拷贝(Value Copy)是一种常见的数据操作,主要用于对象之间的属性值复制。这个主题涉及到Java中的浅拷贝和深拷贝概念,以及如何利用工具库如Apache Commons BeanUtils进行对象属性的便捷复制。 ...

    java学习java语言的值传递和引用传递

    java学习java语言的值传递和引用传递

    java中传值与传引用

    在Java编程语言中,函数调用时的参数传递方式有两种:传值(Passing by Value)和传引用(Passing by Reference)。虽然Java官方文档中并未明确指出有传引用这一概念,但在实际操作中,Java的行为类似于传引用,尤其...

    Java 值传递Visio资源

    在Java中,参数传递有两种方式:值传递和引用传递。这个“Java 值传递Visio资源”包含了几个Visio图形文件,帮助我们直观地理解这两种传递方式。 1. **值传递**: 当方法调用时,对于基本类型(如int, double, char...

    浅析Java引用类型和方法参数传递

    Java中,无论是值类型还是引用类型,在作为方法参数传递时,都遵循着一种被称为“按值传递”的机制。这意味着,当我们将一个变量作为参数传递给方法时,实际上传递的是该变量的一个副本。 ##### 1. 值传递 - **原理...

    java源码 java 获取文件md5值(用于检测文件完整性) 2018127

    本示例代码是关于如何使用Java来计算文件的MD5哈希值,这对于检查文件在传输或存储过程中是否被篡改非常有用。 首先,我们需要引入Java Cryptography Extension (JCE),它提供了加密和解密的功能,包括MD5算法。在...

    Java 值传递和引用传递详解及实例代码

    Java中的值传递和引用传递是编程中非常重要的概念,它们涉及到函数或方法调用时参数的传递方式。值传递指的是函数或方法接收到的是变量的一个副本,而引用传递则是函数或方法接收到的是变量内存地址的副本。这两种...

    Java基础:对象及引用祥解

    Java中的参数传递方式分为两种:一种是按值传递,另一种则是按引用传递。然而,Java实际上只支持按值传递,即便是对象也不例外。这里的“值”指的是基本类型的实际值,以及对象引用的值。 1. **基本类型的参数传递*...

Global site tag (gtag.js) - Google Analytics