关于java的传值和传引用

转载 2013年12月02日 17:21:35

QIf Java uses the pass-by reference, why won't a swap function work?

AYour question demonstrates a common error made by Java language newcomers. Indeed, even seasoned veterans find it difficult to keep the terms straight.

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:

public void badSwap(int var1, int var2)
{
  int temp = var1;
  var1 = var2;
  var2 = temp;
}


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 from int to Object, since Java passes object references by value as well. Now, here is where it gets tricky:

public void tricky(Point arg1, Point arg2)
{
  arg1.x = 100;
  arg1.y = 100;
  Point temp = arg1;
  arg1 = arg2;
  arg2 = temp;
}
public static void main(String [] args)
{
  Point pnt1 = new Point(0,0);
  Point pnt2 = new Point(0,0);
  System.out.println("X: " + pnt1.x + " Y: " +pnt1.y); 
  System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
  System.out.println(" ");
  tricky(pnt1,pnt2);
  System.out.println("X: " + pnt1.x + " Y:" + pnt1.y); 
  System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);  
}


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

X: 0 Y: 0
X: 0 Y: 0
X: 100 Y: 100
X: 0 Y: 0


The method successfully alters the value of pnt1, even though it is passed by value; however, a swap of pnt1 and pnt2 fails! This is the major source of confusion. In the main() method, pnt1 and pnt2 are nothing more than object references. When you pass pnt1 and pnt2 to the tricky() method, Java passes the references by value just like any other parameter. This means the references passed to the method are actually copies 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's Java in a Nutshell by David Flanagan (see Resources) 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中传值和传引用的区别

声明:此文是作为本人自己学习的心得与总结,同时也是与同学们进行交流,如果有错误的地方,希望同学们进行指正        在这里,要想搞清楚二者的区别,那么首先明白两个概念,“传值”、“传引用”。   ...
  • sunguoqingufo
  • sunguoqingufo
  • 2016年02月21日 14:26
  • 4368

Java中传值与传递引用的区分

基本类型传的是值,例如:int,float,double,char,不包括 java.lang.String 对象实例,接口实例传的是引用,包括java.lang.String。但是我们在通过一个...
  • zkp0601
  • zkp0601
  • 2015年10月30日 17:29
  • 952

传值、传引用、传值

一、 函数参数传递机制的基本理论   函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。以下讨论称调用...
  • azhexg
  • azhexg
  • 2013年07月12日 15:20
  • 9406

C++中传值、传址与传引用的区别

1、参数传递的概念  所谓参数传递就是用函数调用所给出的实参(实际参数)向函数定义所给出的形参(形式参数)设置初始值的过程。 在c++中,调用函数时有三种参数传递方式,分别为: (1)传值调用;...
  • Silence723
  • Silence723
  • 2016年07月19日 10:07
  • 1436

PHP值传递和引用传递的区别。什么时候传值什么时候传引用

(1)按值传递:函数范围内对值的任何改变在函数外部都会被忽略 (2)按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改 (3)优缺点: A:按值传递时,php必须复制值...
  • qq_39902227
  • qq_39902227
  • 2017年11月13日 15:04
  • 60

【基础篇-堆栈】传值?传引用?(二)

上一篇主要分析阐述了java中数据如何存储在堆、栈中,是为更好的解释传值、传引用做一个铺垫,本篇将以非常简单的方法调用作为切入点,来分析什么是值的传递,什么是引用的传递。...
  • The_Ashes
  • The_Ashes
  • 2017年03月30日 09:37
  • 226

传值和传引用、传指针的区别

c语言中所有传递给函数的参数
  • a15994269853
  • a15994269853
  • 2014年04月18日 09:50
  • 10822

Java中的值传递和地址传递(传值、传引用)

Java传递参数有两种方式:值传递和引用传递 值传递是传递数据:如基本数据类型都是值传递 引用传递是把形参和实参的指针指向了堆中的同一对象,对象的引用和数组的引用。 实参,Java的基本数据类型...
  • u012546338
  • u012546338
  • 2017年06月30日 22:54
  • 369

php中传值与传引用的区别?

php传值:在函数范围内,改变变量值得大小,都不不会影响到函数外边的变量值。 PHP按引用:在函数范围内,对值的任何改变,在函数外部也有所体现,因为传引用传的是内存地址。 大牛的解释:...
  • qq_28194557
  • qq_28194557
  • 2017年04月23日 19:19
  • 1305

传值,传指针和传引用区别和联系

C++写了很多年,有一天,写着写着代码。竟然自己发现对传值,传指针,传引用这个每天都在用的传递方式的区别还不是很清楚。以为自己懂了,其实还理解得还不够深入,基础还需要花时间琢磨。今天参考了很多篇博客和...
  • zx3517288
  • zx3517288
  • 2016年11月27日 12:15
  • 812
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于java的传值和传引用
举报原因:
原因补充:

(最多只允许输入30个字)