Skip to main content

Java函数参数的传递机制

Java函数参数的传递是以传递值,或者说副本来进行的。

看到上面这句话可能从C/C++转过来的程序员可能会有些疑惑,那岂不是没有引用传递这一说了。那有些函数我需要用到传递引用怎么办呢?

其实不然,Java函数也是可以传递引用的(是不是更迷惑了:))。 其实这要设计到Java变量和类型的存储引用机制。Java对原始变量存值,而对其它对象采用引用操作,类似C/C++的指针。如果我们称后者为引用类型的话。那么但引用类型传递给函数时,Java函数复制一个引用的副本 (这时这个引用的副本可以理解为 指向原对象指针的副本)。这样对这个引用的操作就会实时的反映到原对象上面。也即完成了原来C/C++中传递指针或者引用的功能。

这样就不难理解为什么Java函数参数是传递值的了。

下面给出一个小小的例子:

class Ob {
   int value = 0;
   public Ob(int i) {
     value = i;
   }
}


public class Test {

public void increaseValue(int i){
i += 1;
System.out.println("In function i = " + i);
}

public void increaseValue(Ob ob){
ob.value += 1;

System.out.println("In function ob = " + ob.value);
}

public void increaseValue(Integer it){
it += 1;

System.out.println("In function it = " + it);
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

Test test = new Test();

System.out.println("This is a Test");

int i = 0;
Integer it = new Integer(0);
Ob    ob = new Ob(0);

System.out.println("Before Function i = " + i);
test.increaseValue(i);
System.out.println("After Function i = " + i);

System.out.println("Before Function it = " + i);
test.increaseValue(it);
System.out.println("After Function it = " + it);

System.out.println("Before Function ob = " + ob.value);
test.increaseValue(ob);
System.out.println("After Function ob = " + ob.value);
}
}

===================output================
This is a Test

Before Function i = 0
In function i = 1
After Function i = 0

Before Function it = 0
In function it = 1
After Function it = 0

Before Function ob = 0
In function ob = 1
After Function ob = 1

Comments

Popular posts from this blog

Oracle ORA-01000 maximum open cursors exceeded

Several days ago, I wrote a piece of program in C#/.Net to import some records into oracle database. It is windows version 10g XE. When the program is running, I got a run-time error which is ORA-01000 maximum open cursors exceeded. Here is the Oracle docs about ORA-01000: ORA-01000 maximum open cursors exceeded Cause: A host language program attempted to open too many cursors. The initialization parameter OPEN_CURSORS determines the maximum number of cursors per user. Action: Modify the program to use fewer cursors. If this error occurs often, shut down Oracle, increase the value of OPEN_CURSORS, and then restart Oracle. In order to solve this problem, I increased my OPEN_CURSORS by using: ALTER SYSTEM SET open_cursors = 5000 SCOPE=BOTH; You can use SQL/PL client and "connect" command to login the database system by using "system" user to change the open_cursors. If you are using .NET, DBA, and Java programming, please remember to close all the re...

人权与主权

前些天看到一个,讲测定一个人的政治倾向。其中有一道题选择说是: “人权高于主权” 还是 “主权高于人权”。 博主说博主本人选择是“人权高于主权”,可是博主国内的的父亲却选择是“主权高于人权”。 其实这根本就是一个伪命题,茶余饭后聊聊,口水战一下还可以。可是要是仔细追究起来,恐怕事实上美国国家都采用的是“主权高于人权”的行为。打个比方说,现在很多国家的人民都想加入美国,拥有美国国籍。如果我们把人权定义为:人有追求自由,幸福的权利。那么这些想加入美国国籍的人们的意愿就是人权的范畴。那人权是不是要高于主权呢?我想大家都知道,因为美国的主权关系,美国要审查你的资格。如果能为美国所用,美国欢迎你加入;如果不是,恐怕就很难咯。 当年日本侵华打的旗号是建立大东亚共荣圈,只是没有民主那么好听而已。

(zz) 我为旅行狂---Grand Canyon惊鸿之撇(2010年5月6日--9日)

对于黄石 , 大峡谷 , 还有大瀑布的狂热执着 , 我们终于在上周末实现了三分之一的圆梦计划 . 其中要鼎立感谢我家本田 20 小时不遗余力地勤劳工作 . 这其中要对家庭成员熊宝未能加入深表遗憾 . 这其中要对在母亲节作出卓越贡献的老妈送上经久不息的热烈掌声。 大峡谷国家公园在美国西部亚利桑那州,以横贯其中的科罗拉多河在亿万年间切割出的大峡谷而闻名世界 , 大峡谷总长 446 公里,最宽处近 30 公里,最深处 1600 米。河水切出的岩石断壁纵跨地球形成过程中逾 10 亿年的历史 . 这条著名的峡谷由安静流淌在谷底的科罗拉多河用 600 万年的光阴一点点切割而成 . 河水层层切割出的岩石断面展现了从 20 亿年前至今的地球形成史 ... 这些数字 , 不免让人觉得生硬 . 真正的感受,数字又确实无法衡量 . 只有你亲身站在绝壁边,放眼这浩瀚的旷世奇景 , 才能从心底里发出对造物的由衷赞叹 .                                                                         大峡谷不只是一道深深的山谷,宽阔的峡谷中,层层叠叠还有许多陡峭的山体和峭壁,形态千变万化。这一带山体呈红褐色 , 纵横数十里的视线被大气朦胧着,恍然如视沙漠中的海市蜃楼。这就是大峡谷最著名的风光之一沙漠全景 (Desert View) 。我们于峡谷的南缘驻车 , 开始徒步地探寻这一派奇观绝景 ,5 月的时节对于峡谷来讲还是分外温柔的 , 可惜色彩略显单薄 . 远远地向峡谷对面北缘眺去 , 依稀见得松绿的植被开始悄然萌动 . 北缘也是有游人的吧 , 像我们一样感叹着自然的力量 , 膜拜着这绝对浑然天成的奥妙 . 去谷底只有两个办法,走路或者骑骡子。骑骡入谷,是大峡谷上百年来长盛不衰、最具风景的一项活动。不过,在骡背上摇晃着,随着骡队前进,在山崖边毫无规则而又及其狭窄的小道上...