Java函数参数的传递是以传递值,或者说副本来进行的。
看到上面这句话可能从C/C++转过来的程序员可能会有些疑惑,那岂不是没有引用传递这一说了。那有些函数我需要用到传递引用怎么办呢?
其实不然,Java函数也是可以传递引用的(是不是更迷惑了:))。 其实这要设计到Java变量和类型的存储引用机制。Java对原始变量存值,而对其它对象采用引用操作,类似C/C++的指针。如果我们称后者为引用类型的话。那么但引用类型传递给函数时,Java函数复制一个引用的副本 (这时这个引用的副本可以理解为 指向原对象指针的副本)。这样对这个引用的操作就会实时的反映到原对象上面。也即完成了原来C/C++中传递指针或者引用的功能。
这样就不难理解为什么Java函数参数是传递值的了。
下面给出一个小小的例子:
===================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
看到上面这句话可能从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