//public class TT {
// static void changeStr(String str){
// str = "welcome";
// }
// public static void main(String[] args){
// String str = "1234";
// changeStr(str);
// System.out.println(str);
// }
//}
结果为何是1234
这里是引用传递,str的值应该改变了呀!!!!
求解
// static void changeStr(String str){
// str = "welcome";
// }
// public static void main(String[] args){
// String str = "1234";
// changeStr(str);
// System.out.println(str);
// }
//}
结果为何是1234
这里是引用传递,str的值应该改变了呀!!!!
求解
没有传引用!!!
String类型的值是不能改变的,StringBuilder和StringBuffer的值才是可以改变的,你看看String到底是怎么定义的吧?他是final类型的。我查了下JAVA API:public final class Stringextends Objectimplements Serializable, Comparable<String>, CharSequenceString 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:
String str = "abc";
等效于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);你自已好好体会下final啦,它是不能被改变的~~
这里,是将str的地址拷贝了一份传给方法的局部变量,所以还是值传递。调用方法后,原来的str和方法内的局部变量str都指向了“1234”这块地址。
执行str = "welcome";后,局部变量str改指向"welcome"这块地址。但是原来的str还是没有变,还是指向“1234”这块地址。
2。你也知道传过去的是引用,但是你想一下你传过去的引用传给谁了?
你传过去的引用传给了 changeStr(String str)这个方法中 str。也就是说将mian方法中的
str="1234"这个str的地址作为方法中str的值传过去了。 看下面:
str="1234";
changeStr(str);
str="mian方法中的str的地址";而 changeStr()方法中的str的地址是不会改变的。
所以:mian方法中的str还是等于------1234
擦,我说的话好纠结~~~
public class TT {
static void changeStr(String str){ //在该方法里声明了一个str, str="1234"
str = "welcome"; //该方法的str="welcome"
}
public static void main(String[] args){
String str = "1234";
changeStr(str); //将 str="1234"传递
System.out.println(str); //main 里的str没有变化,还是1234
}
}
如果想要的结果,应该这么写public class TT {
static String changeStr(String str){ //在该方法里声明了一个str, str="1234"
str = "welcome"; //该方法的str="welcome"
return str; //返回str="welcome"
}
public static void main(String[] args){
String str = "1234";
str = changeStr(str); //将 str="1234"传递,并将changeStr方法的返回值赋给str
System.out.println(str);
}
}
Integer xxx = new Integer(10);xxx本来引用对象new Integer(10);再执行xxx= new Integer(1000);
这样xxx引用了新的对象,并没有改变原来的那个对象new Integer(10);题目中的也是一样
在
static void changeStr(String str){
str = "welcome";
}在方法调用的时候,将对象传给了str,然后str="welcome";实际这个str是引用了新的对象.与外边的方法的变量,对象无关.给一个区别的例子static void test(StringBuffer buff){
buff= new StringBuffer("");
buff.append("new string");
}这个与题目相同,再看下边的static void test(StringBuffer buff){
buff.append("new string");
}上边一个是不会改变(append)方法传进来的对象,而后边将会在传进来的对象后边加上字符中,达到了修改外边方法的对象的目的.
// static void changeStr(String str){
// str = "welcome";
// }
// public static void main(String[] args){
// String str = "1234";
// System.out.println(changeStr(str));
// System.out.println(str);
// }
//}
这样试试?
static String changeStr(String str){
str = "welcome";
return str;
}
public static void main(String[] args){
String str = "1234";
System.out.println(changeStr(str)+"");
System.out.println(str);
}
}
str的作用域的问题
在changeStr方法里,有一个变量str,这个str不是main方法里的str。
changeStr(str);语句只是给changeStr(str)方法的str传了个引用,让它指向"1234",然后在方法里又让它指向"welcome",而main方法里的str没有一点变化。所以要用全局变量。
为了证明不是传引用或者传值的原因,可以另外写个方法,改变int的值。
综上,
public class TT {
static String str;
static void changeStr(String s){
str="welcome";
}
static void changeA(int a){
a=10;
}
public static void main(String[] args){
str = "1234";
changeStr(str);
System.out.println(str);
int a=0;
changeA(a);
System.out.println(a);
}
}输出:
welcome
0
2.定义的String都是局部变量
3.String的值是不会改变的…
static String changeStr(String str){ //在该方法里声明了一个str, str="1234"
str = "welcome"; //该方法的str="welcome"
return str; //返回str="welcome"
}
public static void main(String[] args){
String str = "1234";
str = changeStr(str); //将 str="1234"传递,并将changeStr方法的返回值赋给str
System.out.println(str);
}
}
{
str="welcome";
} 这里面的str它的使用范围不会超过这对大括号
如果你外面没申请str的字符串引用
你使用这个变量 系统会提示你找不到值 记着 任何变量的使用范围都不会超过 定义它那对大括号
只有一种出外 当这变量是定义在类里头的 可以有一种方式
那就是"对象.变量" 如果是静态的就是 "类.变量"
所以 你这里的两个str实际上是两个完全不同的变量
str="welcome";//就等于重新给str一个引用。
所以在调用的地方没有被改变。