`

看看按值传递和按引用传递

阅读更多
    首先我想谈一下写博文的感受,我觉得博文不一定多么复杂,多么有深度,只要能对看的人有所帮助即可。我不赞同写关于一些框架的整合文章,比如struts2与spring整合之类的。当然要是开辟专栏系统得介绍框架的使用就另当别论了。因为在平时开发工作当中,经过几个项目的洗礼,对于框架的使用也就能掌握了。另外一点,在面试的时候,面试官也很少会问某个框架如何使用,一般都会问你这个框架比较深的东西。举个例子,面试官不会问你Spring声明式事务怎么配,会问你Spring利用什么技术实现的这点,会问你Spring是利用什么技术使得利用单例的dao就能实现线程安全。还有不能忽略对基础知识的学习,Spring声明式事务封装的再好,实现的再精妙,底层还是利用java中的基础知识,例如ThreadLocal。闲话说了这么多,可别喷我啊,咱们各抒己见。
    本人上大学的时候,当时学习java的时候,老师是这样给我们讲按值传递和引用传递的。按值传递是将值本身的副本传递给函数参数,这个副本的改变不影响原先的值,按引用传递是讲引用传递给函数参数,对引用所指向的对象的改变将反应到原先的对象本身。现在想想讲的有点笼统,不是很清楚。
    其实不管是按值传递和按引用传递,本质上说都是按值传递,只不过对于一些值类型(java中的一些基本类型,例如int,long等等)传递的是这个值的副本,改变的也是副本,函数返回的也是这个副本值,跟原来的那个值完全就是两码事了。例如下面的图


将i传给change函数,传的是i的值的副本,也就是另外一个5,生成的6,跟原来的i没有关系了。
    按引用传的是什么呢,也是引用值的一个副本(所以我才说本质上说都是按值传递),只不过这个副本和原先的引用都指向的一个堆对象(继承于object),那么你最后生成的那个引用跟原先的引用有什么关系吗?有关系,就是他们都指向一个堆对象,所以对引用副本所指的对象的改变也会反应到原先的那个引用上面(有个特例,String类型)。例如下图,对User U这个引用的副本所指向的堆对象也会反应到原先的那个引用上。


产生按值传递和按引用传递这两个术语的本质原因还是基本类型和对象的区别。传递的时候都是传的值的副本。只不过这个值到底是不是引用的区别。
  • 大小: 17.9 KB
  • 大小: 24.8 KB
1
2
分享到:
评论
3 楼 kely39 2013-05-31  
谢谢分享,虽然知道,但也温习了下
2 楼 ddlgyq 2013-05-31  
xishuixixia 写道
其实这是一个不是问题的问题

恩 是的  个人有个人的理解
1 楼 xishuixixia 2013-05-31  
其实这是一个不是问题的问题

相关推荐

    Java的按值传递和按引用传递分析.rar

    Java编程语言中有两种参数传递方式:按值传递和按引用传递。理解这两种方式对于编写高效、无误的代码至关重要。 1. **按值传递(Pass by Value)** - Java中的基本类型(如int, double, char等)是按值传递的。这...

    LabVIEW中引用的概念及在VI间传递值

    在VI间传递值,通常有三种方式:按值传递、按引用传递和按共享变量传递。按值传递是最常见的,但会创建数据副本,可能导致性能下降。相比之下,按引用传递能避免这种问题,因为只有引用本身被传递,而不是实际数据。...

    值传递与引用传递-内存解析

    在Python中,对象是通过引用传递的,即使看上去像是值传递,但实际上是引用的副本。例如,如果一个对象`obj`被传递给一个函数,函数可以改变`obj`的属性或内容,这些改变在函数外部也是可见的。 内存解析在理解这两...

    深入浅析JS是按值传递还是按引用传递(推荐)

    在JavaScript中,参数传递主要有两种形式:按值传递和按共享传递,但这种分类并不完全准确。JavaScript的基本数据类型(如数字、字符串、布尔值、null、undefined)是真正意义上的按值传递,而对象类型则更接近于一...

    java值传递和引用传递详解

    所以,尽管看起来像是引用传递,但实际上是值传递的一种特例,即传递对象引用的值。 理解值传递和引用传递对于优化代码和避免意外的副作用至关重要。在编程时,需要根据实际需求选择合适的参数传递方式,确保代码的...

    c++按引用传递

    C++语言中,函数的参数传递方式有三种:值传递、指针传递和引用传递。 值传递是将参数的值复制一份传递给函数,函数对参数的修改不会影响外部变量。例如,void Func1(int x){x = x + 10;}这里,x是外部变量n的一份...

    java参数传递时到底是值传递还是引用传递分享.pdf

    Java中参数传递的方式有两种理解:值传递和引用传递,但这两种说法实际上是对同一种机制的不同角度的描述。下面将详细解释这两种理解方式。 首先,我们来看值传递的理解。在Java中,当一个对象作为参数传递给方法时...

    JS是按值传递还是按引用传递

    按值传递 VS. 按引用传递 按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。...我们先看一个C的例子来了解按值和引用传递的区别:  代码如下: void Modify(int p

    为什么Java只有值传递

    我们先看一下值传递和引用传递的概念和区别 值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 引用传递:是指在调用函数时将实际参数的地址直接...

    2.1.4 C++和C#数据传递 -class类型传递

    C++提供了更多的控制,允许按值和按引用传递,并需要开发者处理拷贝构造函数和赋值操作符。而C#则通过隐式的引用传递简化了这一过程,但在处理复杂对象时,仍需考虑如何正确地复制和赋值。理解这些差异对于编写高效...

    java 之方法调用 方法传参 值传递还是引用传递字节码

    虽然看起来像是“引用传递”,但实际上是“值传递”的一种特殊形式,通常称为“对象引用的值传递”。这意味着传递的是对象引用(内存地址)的一个副本,而不是对象本身。因此,如果在方法内部修改对象的属性,原始...

    值传递与地址传递的区别.pdf

    在C语言中,函数参数的传递方式有三种:值传递、地址传递和引用传递。今天我们将逐个探讨这三种传递形式,并解决一些常见的问题。 值传递 在值传递中,函数参数是通过值的拷贝来传递的。当我们将一个变量作为参数...

    深入理解JavaScript 参数按值传递

    根据标题和描述,我们将深入探讨JavaScript的参数传递机制,主要涉及“按值传递”和看似“按引用传递”的现象,以及实际上的“按共享传递”。 首先,JavaScript中的参数传递是**按值传递**。这意味着当一个变量的值...

    深入理解JavaScript的值传递和引用传递

    这些基本类型在赋值的时候是通过值传递的方式。值得注意的是还有另外三种类型: Array、Function和Object,它们通过引用来传递。从底层技术上看,它们三都是对象。 基本数据类型 如果一个基本的数据类型绑定到某个...

    浅谈JavaScript 函数参数传递到底是值传递还是引用传递

    然而,JavaScript的实现其实更为复杂,它包含了值传递和引用传递的特性,但并不完全等同于这两种方式。 首先,我们来看基础类型的参数传递。例如,对于一个数字`num`: ```javascript function add(num) { num +=...

    JavaScript中的值是按值传递还是按引用传递问题探讨

    这种机制是介于按值传递和按引用传递之间的,它涉及到基本类型和对象类型的不同处理方式。 首先,对于JavaScript的基本数据类型,如数字、字符串、布尔值、null和undefined,它们是按值传递的。这意味着当这些类型...

    JavaScript传递变量: 值传递?引用传递?

    - 对象类型(如数组、函数、对象)是按引用传递的,但是引用的值(地址)按值传递。 - 当对象作为参数传递给函数时,可以在函数内部修改对象的状态,但不能用这种方式改变原始对象的引用。 理解这些概念可以帮助...

    Java中函数是值传递还是引用传递?

    有说有值传递和引用传递两种,也有说只有值传递的,这里只说下个人见解  先看一个例子 public class Test1 { public static void main(String[] args) { int a = 10; changeNum(a); System.out.println("main...

    Java引用变量传递诡异之处

    3. **理解按值传递的概念**:Java中的所有参数传递都是按值传递的,即使是引用类型也不例外。这意味着在方法内部对参数的修改不会影响到外部的原始变量。 掌握这些核心概念对于理解Java中引用类型的行为至关重要,...

    java及C++中传值传递、引用传递和指针方式的理解

    Java和C++对待参数传递有着不同的处理机制,这主要体现在值传递、引用传递和指针方式上。 首先,我们来看Java的值传递。Java中,所有的参数传递都是基于值的。这意味着当一个对象作为参数传递给方法时,实际上是...

Global site tag (gtag.js) - Google Analytics