Java中方法参数传递只有值传递
将值拷贝一份进行传递
1.对于八种基本数据类型和String,传递数据值的副本
基本数据类型传递后,原来的值不变,局部变量(在方法栈里)在方法结束后就被回收了
void change(int value) {
value = 0;
}
num = 123
change(num);
System.out.println(num);//123,不变
对于String类型
void change(String str){
str +="def";//方法栈中的str指向了字符串常量池中的"def",方法结束后就没了
//或者str = new String("def");
}
String s = "abc";
change(s);
System.out.println(s);//abc
2.对于引用类型,传递的是地址值的拷贝,地址值不会变,地址指向的数据会发生改变,但还是原来的那个对象
StringBuilder sb = new StringBuilder("abc");
void change(StringBuilder str) {
str.append("def");
}
change(sb);
System.out.println(sb);//sb被改变了,变成了"abcdef"。
试图new一个新的对象,但是传递的地址值的拷贝,原来的还是不会变
StringBuilder sb = new StringBuilder("abc");
void change(StringBuilder str) {
str = new StringBuilder("def");//方法结束后,栈指向堆空间新的对象引用就没了,白new了
}
change(sb);
System.out.println(sb);//abc
数组也是引用类型,元素值会改变
public class Example{
String str=new String("tarena");
char[]ch={'a','b','c'};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.println(ex.str);//tarena
System.out.println(ex.ch);//gbc
}
public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}
}