Java参数传递

Java
最近使用Java语言实现一些服务,Java语言在传递参数时与C++不同,C++传递参数有三种格式(传值,传指针,传引用),按道理来说Java也应该有传值和传引用之分。然而,Java不同的是传递参数时,传值和引用的格式相同,没有特殊字符作为标记(C++,&)。这样就给很多程序员们带来了一定的困扰。首先请看如下代码和运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public static void main(String[] args) {
// TODO Auto-generated method stub
int n = 0;
StringBuffer sb1 = new StringBuffer("00");
StringBuffer sb2 = new StringBuffer("00");
sb3 = new StringBuffer("00");
change_int(n);
System.out.println(n);
change_String1(sb1);
System.out.println(sb1);
change_String2(sb2);
System.out.println(sb2);
change_String3(sb3);
System.out.println(sb3);
}

public static void change_int(int n) {
n = 1;
}

public static void change_String1(StringBuffer s) {
s.append("11");
}

public static void change_String2(StringBuffer s) {
s = new StringBuffer("00");
s.append("11");
}

public static void change_String3(StringBuffer s) {
s.append("33");
s = new StringBuffer("00");
s.append("11");
}

运行结果如下所示:
result
下面我们分析一下产生这样运行结果的原因。
Java在传递参数时,全部传的是引用,但是在传基本类型时,等号的赋值相当于重新声明了一个参数,比如在chang_String2函数中的StringBuffer若改成String类型,在函数内部重新赋值给String的话,运行该函数时,原来的值是不变的。
所以我们可以认为函数传入基本类型的参数时,是传的参数的拷贝,而传入一个对象时,是传入的引用。如果在函数内部对传入的引用进行更改,则原参数就会跟着变化,如果不改变传入的引用处的值,则不变,可以对比change_String2和change_String3两个函数。