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...

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:...

人权与主权

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