接触java有一段时间了,但是一直对于Java的参数传递很困惑,今天整理一下:
java中参数传递分为两种:值传递、引用传递(又称为地址传递)
JAVA里除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递
值传递:比较好理解,就是传递的是参数的值的拷贝。所以在函数内部无论怎么操作,外部的变量都不会改变。
public class test{
public void add(int i){
i=10;
}
@Test
public void test(){
int a=5;
add(a);
System.out.println(a);
}
}
输出结果:5
引用传递:传递的是对象的地址拷贝,就像钥匙一样,新配的一样可以开原来的门。
public class test{
public void addD(StringBuilder sb){
sb.append("d");
}
@Test
public void test(){
StringBuilder sb=new StringBuilder("abc");
addD(sb);
System.out.println(sb);
}
}
上面的例子,因为传入的是引用的拷贝,所以值会改变。
在了解这个知识点的基础上,有两个需要注意的地方:
(1)Integer对象,为引用传递,但是值不会改变。具体可以参考:Integer参数传递问题
(2)String对象:可以参考:Java 基本数据类型 及 == 与 equals 方法的区别(关于String的讲解摘抄如下)
- String str1 = "abcd"的实现过程:首先栈区创建str引用,然后在String池(独立于栈和堆而存在,存储不可变量)中寻找其指向的内容为"abcd"的对象,如果String池中没有,则创建一个,然后str指向String池中的对象,如果有,则直接将str1指向"abcd"";如果后来又定义了字符串变量 str2 = "abcd",则直接将str2引用指向String池中已经存在的“abcd”,不再重新创建对象;当str1进行了赋值(str1=“abc”),则str1将不再指向"abcd",而是重新指String池中的"abc",此时如果定义String str3 = "abc",进行str1 == str3操作,返回值为true,因为他们的值一样,地址一样,但是如果内容为"abc"的str1进行了字符串的+连接str1 = str1+"d";此时str1指向的是在堆中新建的内容为"abcd"的对象,即此时进行str1==str2,返回值false,因为地址不一样。
- String str3 = new String("abcd")的实现过程:直接在堆中创建对象。如果后来又有String str4 = new String("abcd"),str4不会指向之前的对象,而是重新创建一个对象并指向它,所以如果此时进行str3==str4返回值是false,因为两个对象的地址不一样,如果是str3.equals(str4),返回true,因为内容相同。