class Aaa
{
public static void main(String[] args)
{
char ch[]={'H','e','l','l','o'};
String str=new String("World");
change(ch,str);
System.out.println(str+" and "+new String(ch,0,4));
} public static void change(char ch[],String str){
str="Changed";
ch[0]='S';
}
}
// 为什么返回的是World and Sell,我觉得应该是Changed and Sell,(不过结果的确是他对的.但为什么,String 不是传引用的吗?)
{
public static void main(String[] args)
{
char ch[]={'H','e','l','l','o'};
String str=new String("World");
change(ch,str);
System.out.println(str+" and "+new String(ch,0,4));
} public static void change(char ch[],String str){
str="Changed";
ch[0]='S';
}
}
// 为什么返回的是World and Sell,我觉得应该是Changed and Sell,(不过结果的确是他对的.但为什么,String 不是传引用的吗?)
方法change里面的str一开始和main里面指向了同一个地方
在你改了之后,change里面的改了,可是main里面的不会改,还指向以前的那个。
{
public static void main(String[] args)
{
char ch[]={'H','e','l','l','o'};
StringBuffer str=new StringBuffer("World");
change(ch,str);
System.out.println(str+" and "+new String(ch,0,4));
} public static void change(char ch[],StringBuffer str){
str.delete(0,str.length());
str.append("Changed");
ch[0]='S';
}
}
public static void main(String[] args) {
char ch[] = { 'H', 'e', 'l', 'l', 'o' };
String str = new String("World"); // 返回值
str = change(ch, str);
System.out.println(str + " and " + new String(ch, 0, 4));
} public static String change(char ch[], String str) {
str = "Changed";
ch[0] = 'S';
return str; // 返回修改后的
}
}
你可能不明白楼主的意思,楼主想通过方法改变字符串引用本身.就是以前指向World,现在这个对象不指向World了(World从内存中消失了),而去指向Changed了.你的这个方法是重新给str赋值(就是重新创建了一个字符串对象),以前的那个World还是在内存中.因为string创建的对象是不可以改变的.如果多调用这个方法会创建很多新对象,结果对性能会有影响.退一步说,如果要创建新对象,那也不要方法返回了,在打印前直接就给他赋值就可以了,str = "Changed";这是我的一点看法.如果有不同看法可以讨论.
在change方法里面执行了str2="Changed"的时候,新建了一个"changed"字符串对象,此时把这个字符串对象的引用防止到str2中,如果用在changed方法中增加System.out.println(str)语句,那么会把changed字符输出。整个过程中并没有修改main方法中str1引用变量地址值。所以在main方法中输出str的时候,仍然输出World了。
如下列代码
void g(){
String a = "abc";
f(a);
.......
}
void f(String s){
s="bcd";
}在调用f函数的时候,对g函数中的a做了一个copy(不是对a所指向的对象做一个copy),然后把这个copy传递给了f函数。
在f函数中对s的任意操作都与原来的a无关。只不过,f函数刚开始执行的时候,s和原来的a指向同一个对象而已。
如下列代码
void g(){
String a = "abc";
f(a);
.......
}
void f(String s){
s="bcd";
}在调用f函数的时候,对g函数中的a做了一个copy(不是对a所指向的对象做一个copy),然后把这个copy传递给了f函数。
在f函数中对s的任意操作都与原来的a无关。只不过,f函数刚开始执行的时候,s和原来的a指向同一个对象而已。
你上面的string如果改成stringbuffer就和你预期的结果一样了。