破除java神话(二)
作者: cherami 译
Friday, August 16 2002 10:18 AM
破除java神话之二:参数是传址的
在不同的java新闻组中,参数是传值还是传址一直是一个经常被争辩的话题。误解的中心是以下两个事实:
对象是传引用的
参数是传值的
这两个能够同时成立吗?一个字:是!在java中,你从来没有传递对象,你传递的仅仅是对象的引用!一句话,java是传引用的。然而,当你传递一个参数,那么只有一种参数传递机制:传值!
通常,当程序员讨论传值和传引用时,他们是指语言的参数传递机制,c++同时支持这两种机制,因此,以前使用过c++的程序员开始好像不能确定的java是如何传参数的。java语言为了事情变得简单只支持参数传值的机制。
java中的变量有两种类型:引用类型和原始类型。当他们被作为参数传递给方法时,他们都是传值的。这是一个非常重要的差别,下面的代码范例将说明这一点。在继续前,我们有必要定义一下传值和传引用。
传值意味着当参数被传递给一个方法或者函数时,方法或者函数接收到的是原始值的副本。因此,如果方法或者函数修改了参数,受影响的只是副本,原始值保持不变。
关于java中的参数传递的混乱是因为很多java程序员是从c++转变过来的。c++有引用和非引用类型的变量,并且分别是通过传引用和传值得。java语言有原始类型和对象引用,那么,按照逻辑,java对于原始类型使用传值而对引用是传引用的,就像c++一样。毕竟,你会想到如果你正在传递一个引用,那么它一定是传引用的。这是一个很诱惑人的想法,但是是错误的!
在c++和java中,当函数的参数不是引用时,你传递的是值得副本(传值)。但是对于引用类型就不同了。在c++中,当参数是引用类型,你传递的是引用或者内存地址(传引用),而在java中,传递一个引用类型的参数的结果只是传递引用的副本(传值)而非引用自身。
这是一个非常重要的区别!java不考虑参数的类型,一律传递参数的副本。仍然不信?如果java中是传引用,那么下面的范例中的swap方法将交换他们的参数。因为是传值,因此这个方法不是像期望的那样正常工作。
class Swap
{
public static void main(String args[])
{
Integer a, b;
int i,j;
a = new Integer(10);
b = new Integer(50);
i = 5;
j = 9;
System.out.println(\"Before Swap, a is \" + a);
System.out.println(\"Before Swap, b is \" + b);
swap(a, b);
System.out.println(\"After Swap a is \" + a);
System.out.println(\"After Swap b is \" + b);
System.out.println(\"Before Swap i is \" + i);
System.out.println(\"Before Swap j is \" + j);
swap(i,j);
System.out.println(\"After Swap i is \" + i);
System.out.println(\"After Swap j is \" + j);
}
public static void swap(Integer ia, Integer ib)
{
Integer temp = ia;
ia = ib;
ib = temp;
}
public static void swap(int li, int lj)
{
int temp = li;
li = lj;
lj = temp;
}
}
上面程序的输出是:
Before Swap, a is 10
Before Swap, b is 50
After Swap a is 10
After Swap b is 50
Before Swap i is 5
Before Swap j is 9
After Swap i is 5
After Swap j is 9
因为swap方法接收到的是引用参数的副本(传值),对他们的修改不会反射到调用代码。
译者注:在传递引用和原始类型时还是有不同的,考虑以下的代码:
class Change
{
public static void main(String args[])
{
StringBuffer a=new StringBuffer(\"ok\");
int i;
i = 5;
System.out.println(\"Before change, a is \" + a);
change(a);
System.out.println(\"After change a is \" + a);
System.out.println(\"Before change i is \" + i);
change(i);
System.out.println(\"After change i is \" + i);
}
public static void change(StringBuffer ia)
{
ia.append(\" ok?\");
}
public static void change(int li)
{
li = 10;
}
}
程序的输出为:
Before change, a is ok
After change a is ok ok?
Before change i is 5
After change i is 5
即如果传递的是引用,那么可以修改引用对象的内容,这个改变会影响到原来的对象,而传递的如果是原始类型则不会有影响。这个也是造成误解的原因之一吧。
分享到:
相关推荐
在处理工程文件时,方案往往包含了一些工程实施的具体参数、设备要求、安全措施、成本预算等关键信息。以下是对可能内容的详细解读: 1. 混凝土路面切割深度:提到的“90mm”很可能指的是混凝土路面切割的深度。在...
JAVA技术的体 系结构包括四个方面的技术:JAVA程序设计语言、JAVA class文件、JAVA应用编程接口(API)和JAVA虚拟机(JVM)。这四部分技术贯穿于JAVA编程与调试运行的整个过程中。 JAVA程序设计语言不仅仅适用于...
发言稿中提到了五个关键的“破除”点,分别是“破除僵化保守”、“破除因循守旧”、“破除封闭狭隘”、“破除资源依赖”和“破除随遇而安”,这些都是当前教育改革亟待解决的问题。 1. **破除僵化保守**:面对教育...
Excel破除密码
"海康威视刷机软件破除限制版",即HIKTOOL,是一款专为海康威视设备设计的刷机工具,旨在帮助用户更便捷地完成这一过程。 HIKTOOL这款软件的核心功能主要体现在以下几个方面: 1. **自动修改时间**:在刷机过程中...
### 破除迷思:SOC中的AI 在当今高度数字化的世界中,网络安全已经成为企业和组织不可忽视的关键领域。随着威胁的不断演变和技术的进步,安全运营中心(SOC)面临着前所未有的挑战。本文旨在深入探讨SOC中引入人工...
#### 方法二:通过管理员权限创建新用户 1. **启动安全模式**:同样地,重启计算机并在启动时按下F8键进入“带命令提示符的安全模式”。 2. **使用管理员账户登录**:选择“Administrator”账户登录,此时该账户...
【洞门破除施工组织方案】是针对城市轨道交通建设中一项关键工序——洞门拆除的详细规划,旨在确保施工安全、高效地进行。本方案针对xx市轨道交通1号线一、二期工程土建施工9标段,由中铁二十四局集团于2014年3月...
对于加密的pdf文件,该工具可以破除密码,还给你一个可以编辑查看的pdf文件。
汽车行业周报:汽车行业:发改委鼓励破除汽车消费限制.pdf
【破除桩头施工组织设计】是建筑工程领域中一项重要的技术方案,主要针对桩基础施工后,桩头顶部多余混凝土的剔除工作。这个过程对于确保工程质量,特别是基础的稳定性和承载力至关重要。以下是根据提供的文件内容...
【桩头破除安全技术交底】 桩头破除是一项重要的建筑施工环节,涉及多种安全措施和技术要点。在这一过程中,安全是首要考虑的因素。以下是根据提供的内容详细阐述的几个关键知识点: 1. **个人防护装备**:施工...
【桩头破除技术交底】是建筑工程领域中一项重要的施工环节,主要针对钻孔灌注桩顶部混凝土的凿除工作。这项技术交底详细介绍了施工前的准备工作、施工工艺和方法、质量保证措施、质量验收标准以及文明施工和安全保证...
【灌注桩桩头破除施工组织设计】 灌注桩桩头破除是建筑工程中一个重要的环节,尤其在地铁、桥梁、高层建筑等大型基础设施建设中常见。此施工组织设计针对的是XX市轨道交通十四号线一期工程Ⅰ石湖停车场施工标段的...
在铁路建设过程中,桩头破除是基础工程中的一项重要步骤,特别是在新建铁路德龙烟线德州至大家洼综合Ⅲ标二分部的总干渠中桥项目中,桩头破除的工艺和技术要求尤为关键。以下是针对这一工序的技术交底内容: 一、...
《5G消费者潜力:打破神话周围的神话消费者的5G价值》这份行业报告,深入探讨了5G技术对消费者市场的影响和潜力,旨在揭示5G技术在实际应用中的真实价值,破除围绕这一新兴科技的一些误解。5G,即第五代移动通信技术...
【文档标题】:“路面破除施工设计方案定.doc” 【文档描述】:该文档涉及的是石林彝族自治县一个污水管网一期工程的路面破除施工设计方案,主要内容涵盖了施工的依据、概述、工期计划、施工难点及应对措施,以及...
同时,脚本可以通过命令行参数接收外部输入,如`%1`, `%2`分别代表第一个和第二个参数。 4. **内部命令与外部命令**:批处理中的命令分为两种,内部命令是直接由CMD解释器执行的,而外部命令则是独立的可执行程序。...