`
sunway
  • 浏览: 115168 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java传值还是传引用终极解释,还是看老外解释的清楚啊。

阅读更多

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 

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.

 

分享到:
评论
5 楼 sunsong 2008-10-16  
请注意,String是很特殊的,参看文章http://www-128.ibm.com/developerworks/cn/java/l-jpointer/index.html
4 楼 igogo007 2008-08-06  
<div class='quote_title'>lihongjunzw 写道</div>
<div class='quote_div'>虽然很白,但还是要问,哪位高手能告诉我 original references object references object 上面三个短语是什么意思啊?</div>
<p><br/> original references   原始引用</p>
<p>object references     对象引用 </p>
<p>object                       对象</p>
3 楼 lihongjunzw 2008-08-06  
虽然很白,但还是要问,哪位高手能告诉我
original references
object references
object
上面三个短语是什么意思啊?
2 楼 sunway 2008-06-12  
另参考:http://www.yoda.arachsys.com/java/passing.html
1 楼 sunway 2008-06-12  
写的不错,有机会我在翻译下。

相关推荐

    java数据结构(老外那版,翻译的)

    《Java数据结构(老外那版,翻译的)》是一本专门为Java程序员设计的数据结构教程,它以清晰易懂的方式介绍了各种重要的数据结构概念。这本书是初学者的优秀选择,特别是对于那些偏好Java语言,不熟悉C++的人来说,...

    一款老外的游戏源码 java学习

    一款老外的游戏源码 有研究或探讨的请加群:37424970 或联系本人MSN或邮箱:zhuseahui@yahoo.com.cn

    老外的英语版的java课件

    "老外的英语版的java课件"可能涵盖了这一语言的各个方面,包括基础语法、类与对象、异常处理、集合框架、多线程、输入/输出(I/O)、网络编程、数据库连接(JDBC)、图形用户界面(GUI)、高级特性如反射和注解等。...

    老外写的__java游戏编程__源码

    这份"老外写的__java游戏编程__源码"是学习和理解这些概念的宝贵资源。让我们深入探讨一下这个领域的关键知识点。 首先,**Java基础知识**是所有Java游戏开发的基石。这包括类、对象、继承、接口、异常处理、数据...

    Java 版LIMS(实验室信息管理系统)

    Java版的LIMS(Laboratory Information Management System,实验室信息管理系统)是一种专为实验室设计的软件系统,用于自动化和优化实验室的工作流程、数据管理和报告。它整合了样本管理、实验记录、数据分析、报告...

    老外用Swing开发的一些JAVA常用窗口编程组件源码.rar

    这个压缩包“老外用Swing开发的一些JAVA常用窗口编程组件源码.rar”显然包含了用Swing实现的各种常见GUI组件的源代码,这对于学习和理解Swing以及Java窗口编程非常有帮助。 Swing提供了丰富的组件库,用于构建桌面...

    java自学路线图(超全超详细)

    * Java 基础语法:推荐 GitHub 上星标 115k+ 的教程,包括 Java 基础、Java 容器、Java 并发、Java 虚拟机和 Java IO。 * 面向对象:包括封装、继承、多态等知识点。 * 数组、字符串、集合:Java 中的基本数据结构。...

    JAVA 利用Swing开发的JAVA常用组件 代码 老外用Swing开发的一些JAVA常用窗口编程组件源码,例如一些窗体选项框、Windows的一些任务面板、任务栏等,像截图所示。另外它还附有文档,从事JAVA开发的朋友,相信你能用得上。

    JAVA 利用Swing开发的JAVA常用组件 ...老外用Swing开发的一些JAVA常用窗口编程组件源码,例如一些窗体选项框、Windows的一些任务面板、任务栏等,像截图所示。另外它还附有文档,从事JAVA开发的朋友,相信你能用得上。

    非常好玩的java 3d游戏,老外SteveSmith制作的转成maven项目.zip

    用java写的项目,源码都经测试过,真实可靠,欢迎自行下载学习。用java写的项目,源码都经测试过,真实可靠,欢迎自行下载学习。用java写的项目,源码都经测试过,真实可靠,欢迎自行下载学习。用java写的项目,源码...

    Java2 类库一本经典老外的书

    本书能够帮助Java程序员获取完整、专业和权威的信息,同时也希望本书能够帮助读者更全面地了解Java语言

    java日期时间选择

    最后根据老外的java日期选择控件做了一点封装,加上了时间选择。 public static void main(String[] args){ try { JFrame frame = new JFrame(); UIManager.setLookAndFeel(...

    经典的老外excel模板

    标题中的“经典的老外excel模板”指的是国外专家或设计师创建的高质量Excel模板,这些模板以其设计美感和功能实用性而受到赞誉。在Excel领域,这样的模板往往具有高度的专业性,能够帮助用户快速有效地组织数据,...

    Java并发编程实战(中文版)

     我觉得这可能就是老外写书的特点吧,因为Java是北美国家(加拿大、美国)开发和维护的,所以老外对Java方方面面的理论知识体系都掌握得是非常清楚和透彻的。翻开这本书看,多线程什么用、什么是死锁、什么是竞争、...

    IOCP.zip_IOCP_iocp 老外_完成端口_完成端口 老外

    完成端口 网络模型 实现 程序 老外写的很好的一个程序

    java API for visio

    老外在visio中积累的java数据类型,供大家使用

    使用Java在服务器端生成JSON代码

    由此,在开源代码有老外使用Java生成JSON代码,本例子是翻写老外的开源例子,在使用部分有非常详细的注释说明,是学习使用Java封装客户端对象的好例子。 环境:Window XP professional, Ant 1.7, JDK 1.6 注意:本...

    2024华数杯C题老外游中国

    本次C题老外游中国的第一问简述就是要求通过给出的旅游数据集,建立数学模型计算出352个城市中所有35200个景点评分的最高分,以及获得这个最高评分的景点数量和城市列表。 设 是352个城市的集合, 是第 个...

Global site tag (gtag.js) - Google Analytics