String传值过程

孟德三笑 2016-12-22 03:15:45
public class Test_String {
public static void changeString(String s){
s="sss";
}
public static void main(String[] args) {
String s="s";
System.out.println(s);
changeString(s);
System.out.println(s);
}
}
String不是引用数据类型吗,那么当调用changeString()方法时,传递的不是内存地址吗,按理说两次输出结果应该不同,但事实是两次输出都是‘s’,与基本数据类型的传值一样了啊,哪个高手可以帮忙解释下?
...全文
637 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
孟德三笑 2016-12-26
  • 打赏
  • 举报
回复
引用 12 楼 qq_36936434 的回复:
//你这里的s是方法体内的, public static void changeString(String s){ s="sss"; } 然后你在main方法中输出你会发现没定义str changeString(s); System.out.println(str); 改为下面才为改变对象,你上面都不同一对象 class Test{ public String s; } public class Test_String { public static void changeString(Test t){ t.s="sss"; } public static void main(String[] args) { Test t=new Test(); t.s="s"; System.out.println(t.s); changeString(t); System.out.println(t.s); } } 此时才为改变对象会输出s与sss 首先你要弄清楚静态变量和静态方法的区别,变量分为成员变量和局部变量,其中成员变量又分为实例变量和类变量(加static)。而static 修饰方法代表此方法为类方法
这正是我的疑惑之处,你这里是新建了一个Test类来传值,类是引用类型,它的传值是将实例化的对象的地址传过去,所以最终结果改变了。但问题是String也是一个最终类,也是引用类型,为什么不是传s的内存地址过去呢
gzcitizeny 2016-12-23
  • 打赏
  • 举报
回复
public static void changeString(String s){
s="sss";
}
这个方法没有返回值,所以s的值是不会变的。可以按三楼的方法把s设置为静态变量,就能实现的。 或者:
public class Test_String {
public static string changeString(String s){
s="sss";
return s;
}
public static void main(String[] args) {
String s="s";
System.out.println(s);
s=changeString(s);
System.out.println(s);
}
}
  • 打赏
  • 举报
回复
changeString(s);//你已经给s赋值了。changeString里面的s="sss" 赋值成s="s";所以输出来的结果是一样的。
qq_36936434 2016-12-23
  • 打赏
  • 举报
回复
//你这里的s是方法体内的, public static void changeString(String s){ s="sss"; } 然后你在main方法中输出你会发现没定义str changeString(s); System.out.println(str); 改为下面才为改变对象,你上面都不同一对象 class Test{ public String s; } public class Test_String { public static void changeString(Test t){ t.s="sss"; } public static void main(String[] args) { Test t=new Test(); t.s="s"; System.out.println(t.s); changeString(t); System.out.println(t.s); } } 此时才为改变对象会输出s与sss 首先你要弄清楚静态变量和静态方法的区别,变量分为成员变量和局部变量,其中成员变量又分为实例变量和类变量(加static)。而static 修饰方法代表此方法为类方法
戴小码 2016-12-23
  • 打赏
  • 举报
回复
strings必须得传递一个值进去,你传得是s指向得值
a_king_long 2016-12-23
  • 打赏
  • 举报
回复
引用 10 楼 qq120074791 的回复:
String s = 's' 这个定义的s有自己的空间 然后方法 changeString()中的s又是一个空间 两个s之间是独立的 你用changeString 改变的s的值在 change方法所在的空间中,并没有改变 String s = 's' 这里定义的s 所在空间的值 你在change方法中加一个输出一看就知道了 我加了一个 输出的结果就是 s 和 sss public class Test_String { public static void changeString(String s) { s = "sss"; System.out.println(s); } public static void main(String[] args) { String s = "s"; System.out.println(s); changeString(s); } }
我也是以前书上看到过类似的 然后网上查的,自己理解的 不知道对不对,初学还在看书中
a_king_long 2016-12-23
  • 打赏
  • 举报
回复
String s = 's' 这个定义的s有自己的空间 然后方法 changeString()中的s又是一个空间 两个s之间是独立的 你用changeString 改变的s的值在 change方法所在的空间中,并没有改变 String s = 's' 这里定义的s 所在空间的值 你在change方法中加一个输出一看就知道了 我加了一个 输出的结果就是 s 和 sss public class Test_String { public static void changeString(String s) { s = "sss"; System.out.println(s); } public static void main(String[] args) { String s = "s"; System.out.println(s); changeString(s); } }
O胖头鱼O 2016-12-23
  • 打赏
  • 举报
回复
我也是来学习的,请问一下,我可以理解为字符串和数组一样是不可变的吗?
Be_nurturing 2016-12-23
  • 打赏
  • 举报
回复
你两次输出的是同一个s,
爱睡觉的阿狸 2016-12-22
  • 打赏
  • 举报
回复
你给方法传递的变量是变量的副本,变量值是跟原有变量一样的,但这是两个不同的变量,所以在方法里,不是原先的变量改变了引用地址,而是你变量的副本改变了引用地址,所以不影响原先的变量。
开车的树懒 2016-12-22
  • 打赏
  • 举报
回复

public class Test {
	static String s;
	public static void changeString() {
		s = "sss";
	}

	public static void main(String[] args) {
		s = "s";
		System.out.println(s);
		changeString();
		System.out.println(s);
	}
}
这样就能输出s和sss了
Ivansimon 2016-12-22
  • 打赏
  • 举报
回复
几乎所有的参考书里面都说过,String 的对象是不可变的,这种说法一般情况下是对的,因为Java的设计者设计字符串的时候跟设计Integer、Long这种封装类型一样,设计成了final,让String 既有对象的特征又有跟int、long等基本类型一样的特征
Ivansimon 2016-12-22
  • 打赏
  • 举报
回复
首先方法参数中的引用是调用地方传入的引用的副本,最初跟调用的地方指向同一块内存区域,这里s = “sss”,其实可以认为是s = new String(“sss”),就是说方法中执行s=“sss”的时候改变了副本的引用,执行完这行语句,副本不再跟调用的地方指向同一块内存区域了

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧