Java传值还是传引用终极解释,还是看老外解释的清楚啊。
来源:互联网 发布:b ab 知乎 编辑:程序博客网 时间:2024/05/02 02:16
by http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
Does Java pass by reference or pass by value?
Why can't you swap in Java?
By Tony Sintes, JavaWorld.com, 05/26/00
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:
- 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
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.
另参考:http://www.yoda.arachsys.com/java/passing.html
- Java传值还是传引用终极解释,还是看老外解释的清楚啊。
- Java是编译的还是解释的
- 还是一个类的初始化问题(初始化过程解释的非常清楚)
- Java的解释执行是先全部解释完后再执行还是边解释边执行?
- 最清楚的解释强引用,弱引用,软引用
- 关于Java中值传递还是引用传递的问题解析-------引用校招笔试中的一道题进行解释
- 理解java传值还是传引用
- java传值还是传引用
- 老声常谈 JAVA 传值还是传引用
- java传值还是传引用
- Java参数传值还是传引用
- Java参数传值还是传引用
- Java - 传值还是传引用?
- Java传值还是传引用
- Java参数传值还是传引用
- Java传值还是传引用
- Java方法传值还是传引用
- java传值还是传引用。
- 初学者的疑问:关于java引用类型标识符
- Tomcat时区设置问题
- 股市值得借鉴的事例
- JAVA流和文件
- Flex 翻页效果
- Java传值还是传引用终极解释,还是看老外解释的清楚啊。
- 关于盏溢出和 Security_cookie
- linux内核与根文件系统的烧写
- 缅怀(转)
- Servlet生命周期
- linux环境变量设置错误后的恢复方法
- GUI编程
- Session、Cookie
- 常见的几个Qt编程问题的处理