一.总则
java中处理八种基本数据类型(byte,short,char,int,long,float,double,boolean)用的是值传递,其他所有类型都用的是引用传递。由于这八种基本数据类型的包装类型都是不可变量,因此增加了对“按引用传递”的理解难度,详见二。
二.String和包装类
如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的 值不会改变原始的值.
如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的 值,那么在函数内的改变会影响到传入的参数。
如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的 地址,所以不会改变参数的值。
/**
*
* @author ZHOUMI2
*/
public class Test {
public static void test1(Integer num){
num = new Integer(5);
}
public static void test2(String str){
str.replace("1", "4");
}
public static void main(String[] args) {
Integer num = new Integer(1);
test1(num);
// 输出结果为1
System.out.println(num.intValue());
String str = new String("123");
test2(str);
// 输出结果为123
System.out.println(str);
}
}
- 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
分析:
上述程序很容易让人误以为String类型和包装类型是值传递。
其实我们认真想一下:
String类型和包装类型都是对象类型,所以必然是引用传递。
但是由于String类和包装类都没有提供value对应的setter方法,我们无法改变其内容,所以导致我们看起来好像是值传递。
参考自 http://blog.csdn.net/wuya814070935/article/details/49250773