Does Java pass by reference or pass by value?
2012-10-16 17:04
651 查看
http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
很好的解释了java的传值还是传引用
“java对象操作是引用,但是传递参数时是传值”
-------------下面是分割线---------------------------
Q:If Java uses the pass-by reference, why won't a swap function work?
A:Your 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:
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:
If we execute this main() method, we see the following output:
Java代码
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.
![](https://oscdn.geek-share.com/Uploads/Images/Content/201303/19/94df8f984432e16fcebfe83eaa813fde.gif)
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.
![](https://oscdn.geek-share.com/Uploads/Images/Content/201303/19/f130cc540b7b35326b445767b728dff8.gif)
Figure 2. Only the method references are swapped, not the original ones
Author Bio
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的传值还是传引用
“java对象操作是引用,但是传递参数时是传值”
-------------下面是分割线---------------------------
Q:If Java uses the pass-by reference, why won't a swap function work?
A:Your 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:
Java代码
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.
![](https://oscdn.geek-share.com/Uploads/Images/Content/201303/19/94df8f984432e16fcebfe83eaa813fde.gif)
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.
![](https://oscdn.geek-share.com/Uploads/Images/Content/201303/19/f130cc540b7b35326b445767b728dff8.gif)
Figure 2. Only the method references are swapped, not the original ones
Author Bio
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.
相关文章推荐
- Does Java pass by reference or pass by value?
- Does Java pass by reference or pass by value?
- [转]Does Java pass by reference or pass by value?
- Java中方法调用参数传递的方式是传值,尽管传的是引用的值而不是对象的值。(Does Java pass by reference or pass by value?)
- Does Java pass by reference or pass by value?
- Pass By Value or Pass By Reference in java
- Java: pass by value or reference?
- 002:Is Java “pass-by-reference” or “pass-by-value”?
- Is Java pass by VALUE or pass by REFERENCE?
- java当中也有pass-by-value值传递或pass-by-reference地址传递吗
- java pass by value 。do not exist pass by reference
- java中的 by value or by reference
- Java 只有值传递(Pass By Value),没有引用传递(Pass By Reference)
- java中的 by value or by reference
- Parameter passing in Java - by reference or by value?
- Java is Pass-by-Value, Never pass by reference
- Java Pass By Value and Pass By Reference
- Effective C++ 20. Prefer pass-by-reference-to-const to pass-by-value
- 尽量用pass-by-reference-to-const(const引用)替换pass-by-value(传值)
- 在利用pass-by-value传参数时发生slicing,改用pass-by-reference-to-const