static void change(String s){ s= "haha"; } public static void main(String args[]){ String s = "wawa"; change(s); System.out.println(s); }你这里相当于对main里的s啥也没做,怎么可能变?change里的s只是一个形参,main里的s才是实参。
public class Haha { static String change(String s){ s= "haha"; return s; } public static void main(String args[]){ String s = "wawa"; s=change(s); System.out.println(s); } } 这样就可以了
先推荐两篇文章1)JAVA 参数传递 http://blog.sina.com.cn/s/blog_5dd380b90100bvel.html2)Java Swapping Using a Wrapper Class http://www.cs.utsa.edu/~wagner/CS2213/swap/swap.html
然后开始改代码楼主的原始示例:public class test { static void change(String s){ s= "haha"; } public static void main(String args[]){ String s = "wawa"; change(s); System.out.println(s); } }在CSDN论坛中,可以使用下面的形式包裹代码,以让代码用相应语言的颜色高亮显示 下划线得自己去除,代码写在java和code间的那两个中括号之间 _[_c_o_d_e_=_j_a_v_a_]_[_/_c_o_d_e_]_
你得先理解传值和传址。 你在change(s);传的是s的值,所以s的值不会变。
根据推荐文章1,JAVA语言: 从程序运行的角度来看,参数传递,只有传值,从不传递其它的东西。 只不过值的内容有可能是数据,也有可能是一个内存地址。根据推荐文章2,可以使用“包装类”的办法实现“在方法内部改值” class MyString { private String dataMemberString; public MyString(final String constructorString) { dataMemberString = constructorString; } @Override public String toString() { return dataMemberString; } public String getDataMemberString() { return dataMemberString; } public void setDataMemberString(String dataMemberString) { this.dataMemberString = dataMemberString; } }public class test1 { static void change(MyString s) { s.setDataMemberString("haha"); } public static void main(String[] args) { MyString s = new MyString("wawa"); change(s); System.out.println(s); }}
注意,即使像第26行这样书写代码也不会修改main方法中的s的值class MyString { private String dataMemberString; public MyString(final String constructorString) { dataMemberString = constructorString; } @Override public String toString() { return dataMemberString; } public String getDataMemberString() { return dataMemberString; } public void setDataMemberString(String dataMemberString) { this.dataMemberString = dataMemberString; } }public class test1 { static void change(MyString s) { // s.setDataMemberString("haha"); s = new MyString("haha"); } public static void main(String[] args) { MyString s = new MyString("wawa"); change(s); System.out.println(s); }}理由参考推荐1
形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。public class test { static void change(String 形参){ 形参 = "haha"; } public static void main(String args[]){ String 实参 = "wawa"; change(实参); 在执行到这里的时候,是形参将实参复制一份,形成了《实参的复制》,然后《实参的复制》赋值为haha,在这个函数调用完成以后,《实参的复制》这个东西就被杀掉了,而原来的《实参》根本没有发生变化。 System.out.println(s); }
s= "haha";
}
这边传入的s是一个java栈的拷贝,然后s= "haha";把复制的s指向了另一个字符串haha,因为s只是一份拷贝,所以不影响原来的s,原来的s还是wawa
s= "haha";
}
public static void main(String args[]){
String s = "wawa";
change(s);
System.out.println(s);
}你这里相当于对main里的s啥也没做,怎么可能变?change里的s只是一个形参,main里的s才是实参。
static String change(String s){
s= "haha";
return s;
}
public static void main(String args[]){
String s = "wawa";
s=change(s);
System.out.println(s);
}
}
这样就可以了
http://blog.sina.com.cn/s/blog_5dd380b90100bvel.html2)Java Swapping Using a Wrapper Class
http://www.cs.utsa.edu/~wagner/CS2213/swap/swap.html
static void change(String s){
s= "haha";
}
public static void main(String args[]){
String s = "wawa";
change(s);
System.out.println(s);
}
}在CSDN论坛中,可以使用下面的形式包裹代码,以让代码用相应语言的颜色高亮显示
下划线得自己去除,代码写在java和code间的那两个中括号之间
_[_c_o_d_e_=_j_a_v_a_]_[_/_c_o_d_e_]_
你在change(s);传的是s的值,所以s的值不会变。
从程序运行的角度来看,参数传递,只有传值,从不传递其它的东西。
只不过值的内容有可能是数据,也有可能是一个内存地址。根据推荐文章2,可以使用“包装类”的办法实现“在方法内部改值”
class MyString {
private String dataMemberString; public MyString(final String constructorString) {
dataMemberString = constructorString;
} @Override
public String toString() {
return dataMemberString;
} public String getDataMemberString() {
return dataMemberString;
} public void setDataMemberString(String dataMemberString) {
this.dataMemberString = dataMemberString;
}
}public class test1 { static void change(MyString s) {
s.setDataMemberString("haha");
} public static void main(String[] args) {
MyString s = new MyString("wawa");
change(s);
System.out.println(s);
}}
private String dataMemberString; public MyString(final String constructorString) {
dataMemberString = constructorString;
} @Override
public String toString() {
return dataMemberString;
} public String getDataMemberString() {
return dataMemberString;
} public void setDataMemberString(String dataMemberString) {
this.dataMemberString = dataMemberString;
}
}public class test1 { static void change(MyString s) {
// s.setDataMemberString("haha");
s = new MyString("haha");
} public static void main(String[] args) {
MyString s = new MyString("wawa");
change(s);
System.out.println(s);
}}理由参考推荐1
static void change(String 形参){
形参 = "haha";
}
public static void main(String args[]){
String 实参 = "wawa";
change(实参);
在执行到这里的时候,是形参将实参复制一份,形成了《实参的复制》,然后《实参的复制》赋值为haha,在这个函数调用完成以后,《实参的复制》这个东西就被杀掉了,而原来的《实参》根本没有发生变化。
System.out.println(s);
}