Java中传递参数,要么传递的是基本数据类型的值的副本,要么传递的是引用数据类型的引用(String类型属于引用数据类型,但由于它是final类,不可变类型,故在传参过程中,其值不会改变)
参数类型为基本数据类型
示例代码
public class Test {
public static void main(String[] args) {
int a = 10;
boolean b = true;
float f = 2.3f;
char c = 'c';
changeInt(a);
changeBoolean(b);
changeFloat(f);
changeChar(c);
System.out.println(a);//10
System.out.println(b);//true
System.out.println(f);//2.3
System.out.println(c);//c
}
public static void changeChar(char c) {
c = 'r';
}
public static void changeFloat(float f) {
f = 5.4f;
}
public static void changeBoolean(boolean b) {
b = !b;
}
public static void changeInt(int a) {
a = 100;
}
}
根据以上代码的输出结果可以看出:当传参类型为基本数据类型时,传递的是值的副本,并不会改变值本身。
参数类型为引用数据类型
示例代码
public class Test {
public static void main(String[] args) {
char[] ch = {'l', 'o', 'v', 'e'};
StringBuilder sb = new StringBuilder("abc");
System.out.println(ch);//love
System.out.println(sb);//abc
changeCh(ch);
changeSb(sb);
System.out.println(ch);//dove
System.out.println(sb);//abcefg
}
private static void changeSb(StringBuilder sb) {
sb.append("efg");
}
private static void changeCh(char[] ch) {
ch[0] = 'd';
}
}
根据以上代码的输出结果可以看出,当参数的数据类型为引用数据类型时,传递的是引用的副本。我们应当了解引用数据类型的创建方式:User u1 = new User();
这样就创建了一个User类的对象,u1是变量名,它存放在栈内存上,u1的值为其指向的user对象所在堆内存上的地址,它只是一个对象的引用,而不是对象的本身。在进行传递时,传递的也只是这个引用的副本,当这个副本的值改变时,原引用的值并不会受到影响。
网友评论