`
jubincn
  • 浏览: 242676 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
文章分类
社区版块
存档分类
最新评论

Java中方法调用参数传递的方式是传值,尽管传的是引用的值而不是对象的值。(Does Java pass by reference or pass by value?)

 
阅读更多

原文地址:http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

在Java中,所有的对象变量都是引用,Java通过引用来管理对象。然而在给方法传参时,Java并没有使用传引用的方式,而是采用了传值的方式。例如下面的badSwap()方法:

当badSwap方法时,原有的var1和var2的值并不会发生变化。即使我们用其它Object类型来替代int,也不会有变化,因为Java在传递引用时也是采用传值的方式。(译者注:这里是关键,全文的核心是:1. Java中对象变量是引用 2. Java中方法是传值的 3. 传方法中参数时,传递的是引用的值)

如果译者的注释没看明白,没关系,看看下面的代码:

执行main()的输出如下:

这个方法成功地改变了pnt1的值,但pnt1和pnt2的交换却失败了!这是Java参数传递机制里最让人迷惑的地方。在main()中,pnt1和pnt2是Point对象的引用,当将pnt1和pnt2传递给tricky()时,Java使用的正是传值的方式,将这两个引用的传给了arg1和arg2。也就是说arg1和arg2正是pnt1和pnt2的复制,他们所指向的对象是相同的。详情可见下面的图示:

图 1. 在作为参数传递后,对象至少有两个引用指向自己

Java copies and passes thereferenceby value, not the object. Thus, method manipulation will alter the objects, since the references point to the original objects. But since the references are copies, swaps will fail. As Figure 2 illustrates, the method references swap, but not the original references. Unfortunately, after a method call, you are left with only the unswapped original references. For a swap to succeed outside of the method call, we need to swap the original references, not the copies.

在main()中,引用被复制并以传值的方式进行传递,对象本身并不会被传递。因此,tricky()方法中pnt1所指向的对象发生了变化。因为传递的是引用的复制,因此引用的交换既不能引起对象的交换,更不会使原始引用发生变化。如图2所示,tricky()交换了arg1与arg2,但不会影响pnt1和pnt2。因此若想交换原始引用pnt1和pnt2,那么不能通过调用方法的方式来实现。


图 2. 只有作为参数的引用发生了交换,但原始引用并没有变化

总结:

1. Java中对象变量是引用

2. Java中方法是传值的

3. 传方法中参数时,传递的是引用的值


原文如下:

Java does manipulate objects by reference, and all object variables are references. However, Java doesn't pass method arguments by reference; it passes them by value.

Take the badSwap() method for example:




When badSwap() returns, the variables passed as arguments will still hold their original values. The method will also fail if we change the arguments type fromint toObject, since Java passes object references by value as well. Now, here is where it gets tricky:



If we execute this main() method, we see the following output:




The method successfully alters the value of pnt1, even though it is passed by value; however, a swap ofpnt1 andpnt2 fails! This is the major source of confusion. In themain() method,pnt1 andpnt2 are nothing more than object references. When you passpnt1 andpnt2 to thetricky() method, Java passes the references by value just like any other parameter. This means the references passed to the method are actuallycopies of the original references. Figure 1 below shows two references pointing to the same object after Java passes an object to a method.


Figure 1. After being passed to a method, an object will have at least two references



Java copies and passes the reference by value, not the object. Thus, method manipulation will alter the objects, since the references point to the original objects. But since the references are copies, swaps will fail. As Figure 2 illustrates, the method references swap, but not the original references. Unfortunately, after a method call, you are left with only the unswapped original references. For a swap to succeed outside of the method call, we need to swap the original references, not the copies.


Figure 2. Only the method references are swapped, not the original ones

About the author

Tony Sintes is a principal consultant at BroadVision. Tony, a Sun-certified Java 1.1 programmer and Java 2 developer, has worked with Java since 1997.O'Reilly'sJava in a Nutshell by David Flanagan (seeResources) puts it best: "Java manipulates objects 'by reference,' but it passes object references to methods 'by value.'" As a result, you cannot write a standard swap method to swap objects.
分享到:
评论

相关推荐

    java中传值与传引用

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

    java中传值还是传引用的的认识

    在 Java 应用程序中,当对象引用是传递给方法的一个参数时,您传递的是该引用的一个副本(按值传递),而不是引用本身。在 C++ 中当传递给函数的参数是引用时,您传递的是这个引用,或者内存地址(按引用传递)。 ...

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

    在Java编程语言中,方法调用和参数...参数传递遵循值传递原则,对于基本类型传递值副本,对于对象类型传递对象引用的副本。通过字节码和开发工具,我们可以更深入地理解这些过程,提升我们的编程技能和问题排查能力。

    浅谈Java中方法的参数传值.pdf

    Java方法参数传值是Java编程中的基础知识点,涉及变量、数据类型和方法调用的机制。在Java中,数据类型分为基本数据类型和引用数据类型。基本数据类型包括布尔型(boolean)、字节型(byte)、短整型(short)、整型...

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

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

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

    综上所述,在Java中,对于基本数据类型的参数传递实际上是按值传递,而对于对象类型的参数传递则是按引用传递的一种特殊形式——传递的是对象引用的副本,但由于这些副本指向同一个对象,因此对对象的修改会影响到...

    JAVA中传值与引用问题

    在这个例子中,`method1`调用`change`方法后,`x`的值变成了“HelloWorld”,这是因为传递的是`x`引用的副本,而`i`和`x`都指向同一个`StringBuffer`对象,因此对`i`的修改也会影响到`x`。 #### 五、进阶讨论 除了...

    浅谈Java中方法的参数传值.zip

    Java中,方法参数的传递主要有两种方式:值传递(Pass by Value)和引用传递(Pass by Reference)。不过,Java并没有真正的引用传递,而是通过对象引用来模拟引用传递的效果。下面我们详细讨论这两种方式。 2. 值...

    C++传值调用与引用调用区别实例代码

    当一个函数被调用时,可以通过不同的方式传递参数,其中最常见的是传值(call by value)和传引用(call by reference)两种方法。这两种方式在内存管理、性能影响以及数据修改能力上有着显著的不同。 #### 1. 传值调用...

    Java传值还是引用

    而在“参数--引用类型”部分,`num`的值在调用`add(ParamTest pt)`方法后变为20,这是因为方法内部修改了对象的属性,而不是更改了引用本身。 值传递和引用传递的概念对于理解Java中的方法调用至关重要。基本类型...

    Java的引用和函数参数传递

    - **引用传递的本质**:Java中的引用传递本质上是传递对象的引用,而不是对象本身。这意味着在方法内部对对象所做的任何改变都会影响到原始对象。 - **引用与值的区别**:与基本类型的值传递不同,引用传递不会创建...

    java值传递与引用传递

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

    C语言函数调用三种方式 传值调用,引用调用和传地址调.doc

    在C语言中,函数调用主要有三种方式:传值调用、传地址调用和引用调用。这三种调用方式决定了函数如何处理传递给它的参数。下面将详细讲解每种调用方式及其特点。 1. 传值调用(Value Passing) 在这种调用方式中...

    VB参数传递(传值ByVal与传址ByRef)[整理].pdf

    传址方式也称引用方式,是 VB 默认的参数传递方式。当调用一个过程时,系统将实参的地址传递给形参,实参与形参在内存中占用相同的存储单元。因此,被调过程中形参值发生变化,主调过程中实参值也会随之变化,这种...

    java调用json参数的webservice

    在探讨Java调用带有JSON参数的WebService之前,我们首先需要了解几个关键的技术概念:Java、JSON以及WebService。 Java是一种广泛使用的编程语言,它具有面向对象、跨平台、多线程以及健壮性等特点。Java在企业级...

    走进Java中方法的参数传递.pdf

    在Java编程中,参数传递是方法调用的核心机制,它决定了方法内部如何处理传递过来的值。Java有两类数据类型:基本数据类型(如int、char、boolean等)和对象类型。这两种类型的参数传递方式有所不同。 对于基本数据...

Global site tag (gtag.js) - Google Analytics