public class StringTest {
public static void main(String[] args) {
String a="aaa";
System.out.println(a);
change(a);
System.out.println("修改后的a:"+a);
}
public static void change(String a) {
String b="bbb";
a=b;
System.out.println("change方法中的a:"+a);
}
}
String为引用数据类型,传递过去的是地址,地址在方法内进行了重新修改,出来后指向不应该是指向了bbb吗?怎么还是aaa?求助
自己也是初学者,见解不深刻,回答有点武断。不好意思,一起学习,我今天也遇到这个问题。回答之后,感觉自己的结论有问题。
借你宝地,请高手问答:
public class QueueTest {
public static void main(String[] args) {
String[] a=new String[1];
a[0]="aaa";
System.out.println(Arrays.toString(a));
change(a);
System.out.println("main中:"+Arrays.toString(a));
}
public static void change(String[] a){
String[] b={"bbb"};
a[0]=b[0];
a=b;
System.out.println("change中:"+Arrays.toString(a));
}
}
//===变了==
[aaa]
change中:[bbb]
main中:[bbb]
//===============================
/*public class QueueTest {
public static void main(String[] args) {
String[] a=new String[1];
a[0]="aaa";
System.out.println(Arrays.toString(a));
change(a);
System.out.println("main中:"+Arrays.toString(a));
}
public static void change(String[] a){
String[] b={"bbb"};
a=b;
System.out.println("change中:"+Arrays.toString(a));
}
}
//===没变
[aaa]
change中:[bbb]
main中:[aaa]
*/
这是作用域的问题,main中a作用域在main里,所以不会改变。而你调用方法的时候把a带出来了,执行了调用的方法,所以change中的a会发生改变。记住:作用域。。
a传的是地址 这个时候a指向的是"aaa"的地址
change方法里面的这个a并不是main方法里面的a,虽然它们都指向"aaa",但是不是同一个变量
所以,比你让a=b,只是让change里面的a指向"bbb",此时main里面的a指向没变!
String不是传指针,如果是List就是传指针
哦,错了,string是传递引用这里外面的a是实参,change中的a为形参,形参为临时的指向外面的a,但是这里你又将b赋值给a,这个临时的形参又重新指向了b,与外部的a就没有任何关系了。
另外补充一点,其实string使用过程中只要进行了操作,那么就会生成new出新的string(隐式的),所以string的操作跟普通的值传递给人的感觉是一样的。
可以这么理解:传递引用参数的时候传递的是一个地址的值,实参a的地址被赋给了形参a,在change里面改变形参的地址并不会影响到实参。
public class QueueTest {
public static void main(String[] args) {
String a="aaa";//new String("aaa");
System.out.println(a);
change(a);
System.out.println("main中:"+a);
}
public static void change(String a){
String b="bbb";
b=a;//此处
System.out.println("change中:"+a);
}
}
//JAVA 函数参数是值传递。 再说,你上面的初始化方式String a="aaa";
“aaa”在常量池里面,程序加载之后,只要JVM不挂掉,谁都改不了,连GC都回收不掉。
想要改变的话将a变为全局变量写在main方法上面就可以了
问了下老师,老师说是在change方法里出了个临时的String变量,并没有影响主方法里的String a