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

Comparison == vs equals() in Java

In java, we have two operations (" == " and " equals() ") to check the equivalence of String s. It is important to understand that the difference between them.    == The == operator compares the two objects and checks to see if two objects are exactly the same object (refer to the same instance). .equals() The equals() method compares the characters in the two different objects. Two strings may be different objects , but can contains the same values (exactly the same characters). public class Main {     public static void main(String[] args) {         String s1 = "Shangshu";         String s2 = new String(s1);         System.out.println(s1 + " == " + s2 + " is " + (s1 == s2));         System.out.println(s1 + ".equals(" + s2 + ") is " + (s1.equals(s2)));     } } The output of the above code is:...

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 月的时节对于峡谷来讲还是分外温柔的 , 可惜色彩略显单薄 . 远远地向峡谷对面北缘眺去 , 依稀见得松绿的植被开始悄然萌动 . 北缘也是有游人的吧 , 像我们一样感叹着自然的力量 , 膜拜着这绝对浑然天成的奥妙 . 去谷底只有两个办法,走路或者骑骡子。骑骡入谷,是大峡谷上百年来长盛不衰、最具风景的一项活动。不过,在骡背上摇晃着,随着骡队前进,在山崖边毫无规则而又及其狭窄的小道上...