Java code
public class Test2
{
public static void changeStr(String str){
str = "welcome";
}
public static void main(String args[]){
String str = "1234";
changeStr(str);
System.out.println(str);
}
}
这段代码的输出结果是:1234.可是我不明白,为什么调用了changeStr这个方法后,没有改变?本人小菜一个,大家多看看.谢谢
回答:
1.跟静态没有一点关系,下面结果一样!
public class Test2
{
public void changeStr(String str){
str = "welcome";
}
public static void main(String args[]){
String str = "1234";
new Test2().changeStr(str);
System.out.println(str);
}
}
2.跟String的不可改变和StringBuffer也没有一点关系,下面结果还是一样!
public class Test2 {
public void changeStr(StringBuffer str){
str = new StringBuffer("welcome");
}
public static void main(String args[]){
StringBuffer str = new StringBuffer("1234");
new Test2().changeStr(str);
System.out.println(str);
}
}
3.只是JAVA中传参的小问题,用下面这个例子分析:
package org.leno;
public class Student {
private String username;
public Student(String username) {
super();
this.username = username;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
public class Test2 {
public void changeStr(Student str2){
str2 = new Student("welcome");
}
public static void main(String args[]){
Student str = new Student("1234");
new Test2().changeStr(str);
System.out.println(str.getUsername());
}
}
虽然传参的时候str和str2指向同一个学生对象,但在方法里面我们将str2变量指向了其它对象,而这时候的str
还是指向原来的学生对象,所以打印出来的依然是原来学生的名字。浅显点说就是和下面的情况差不多:
Student str = new Student("1234");
Student str2 = str;
str2 = new Student("welcome");
打个比方就是原本两根线都栓着同一个宠物,而后来一根线栓向另一个宠物去了,(虽然这根线很快就消失了,没有任何意义,局部变量嘛!),
但原先的线栓的宠物是没有任何改变的!