字符串交换问题求助

twoheads 2017-09-27 05:32:41
字符串交换的问题
public static void swap(String a, String b)
{
String temp = a;
a = b;
b = temp;
}

这样交换的是形参,不能改变实参,我可以理解,可是为什么下面的代码,通过定义一个类就可以成功呢?是因为改变了对象的内容吗?求教!
//先定义一个类
class number{
int test;
}
public Test{
public void swap(number a,number b){
int temp=a.test;
a.test=b.test;
b.test=temp;
}
}
...全文
263 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
miaoch 2017-09-29
  • 打赏
  • 举报
回复
public class Test{
	public static void main(String[] args) {
		String a = "a";
		String b = "b";
		//swap(a, b); 相当于:
		{
			String a1 = a;
			String b1 = b;
			String temp = a1;
			a1 = b1;
			b1 = temp;
		} //出来之后a还是a,b还是b。和a1,b1无关。
		Myclass s = new Myclass();
		s.str1 = "111";
		s.str2 = "222";
		//change(s);相当于
		{
			Myclass s1 = s;
			String temp = s1.str1;
			s1.str1 = s1.str2;
			s1.str2 = temp;
		} //出来后s和s1指向的是同一个对象。而这个对象已经被修改了
		
		//总结:你无法改变传入方法之前的引用指向的对象。但是你可以去改变那个对象(比如它的变量)
	}
	public static void swap(String a1, String b1) {
		String temp = a1;
		a1 = b1;
		b1 = temp;
	}
	public static void change(Myclass s1) {
		String temp = s1.str1;
		s1.str1 = s1.str2;
		s1.str2 = temp;
	}
}
class Myclass {
	public static String str1;
	public static String str2;
}
qq_40445465 2017-09-29
  • 打赏
  • 举报
回复
string s="abc"方式定义的字符串内存地址分配在栈上,和定义基本类型变量一样。
string s=new string()方式定义的字符串对象内存地址分配在堆上
绝望的奶黄包 2017-09-28
  • 打赏
  • 举报
回复
引用 7 楼 Lilywlp 的回复:
[quote=引用 6 楼 jam_show 的回复:] String a = "A" ,b = "B"; 第一种方式,public void swap(String a1,String b1) 方法内a1是a的地址,b1是b的地址。 String temp = a1;//temp为a1地址 a1 = b1;//a1为b1地址; b1 = temp;//b1为temp地址。 这里你只交换了a1, b1的地址,所以最终输出的结果还是a="A",b="B"; 第二种方式 Myclass s = new Myclass(); s.a = "A"; s.b = "B"; public static void change(Myclass s1) 这里s1指向的是s的地址。 你在方法内交换了s1两个参数的值,但是s1的地址没有变。 s的输出结果是a="B",b="A" 应该是这样,跑一下看看。所有输出结果正确那我说的没错,如果错了那就是我在胡说。
非常感谢你的细心解答,我还是有点疑问: 方法一我改变了a1,b1指向的地址,对输出实参a,b没有影响。可是在s2中我改变的也是s1,输出的也是s呀,为什么引用s1的改变会影响到s呢。s.a="A"与s="A"在对对象"A"的引用时有什么不同吗[/quote] 方法1中你交换了a1,b1的地址,而不是a1,b1地址的值。所以a,b输出不受影响。 方法二你改变的是s1的值,但是并没有改变s1的地址,所以s1和s还是同一个引用。
chho93 2017-09-28
  • 打赏
  • 举报
回复
对于基本类型, 方法的值传递 传递的是形参, 不会改变原来的值, 对于对象, 方法的值传递 传递的是这个对象的引用, 会改变这个对象的属性值
twoheads 2017-09-27
  • 打赏
  • 举报
回复
引用 6 楼 jam_show 的回复:
String a = "A" ,b = "B"; 第一种方式,public void swap(String a1,String b1) 方法内a1是a的地址,b1是b的地址。 String temp = a1;//temp为a1地址 a1 = b1;//a1为b1地址; b1 = temp;//b1为temp地址。 这里你只交换了a1, b1的地址,所以最终输出的结果还是a="A",b="B"; 第二种方式 Myclass s = new Myclass(); s.a = "A"; s.b = "B"; public static void change(Myclass s1) 这里s1指向的是s的地址。 你在方法内交换了s1两个参数的值,但是s1的地址没有变。 s的输出结果是a="B",b="A" 应该是这样,跑一下看看。所有输出结果正确那我说的没错,如果错了那就是我在胡说。
非常感谢你的细心解答,我还是有点疑问: 方法一我改变了a1,b1指向的地址,对输出实参a,b没有影响。可是在s2中我改变的也是s1,输出的也是s呀,为什么引用s1的改变会影响到s呢。s.a="A"与s="A"在对对象"A"的引用时有什么不同吗
绝望的奶黄包 2017-09-27
  • 打赏
  • 举报
回复
String a = "A" ,b = "B"; 第一种方式,public void swap(String a1,String b1) 方法内a1是a的地址,b1是b的地址。 String temp = a1;//temp为a1地址 a1 = b1;//a1为b1地址; b1 = temp;//b1为temp地址。 这里你只交换了a1, b1的地址,所以最终输出的结果还是a="A",b="B"; 第二种方式 Myclass s = new Myclass(); s.a = "A"; s.b = "B"; public static void change(Myclass s1) 这里s1指向的是s的地址。 你在方法内交换了s1两个参数的值,但是s1的地址没有变。 s的输出结果是a="B",b="A" 应该是这样,跑一下看看。所有输出结果正确那我说的没错,如果错了那就是我在胡说。
twoheads 2017-09-27
  • 打赏
  • 举报
回复
引用 1 楼 jam_show 的回复:
java的基本数据类型是分配在栈上的,而引用类型是分配在堆上的。 String改变的是引用地址,你可以理解。 为什么对象可以成功?因为你在对象里定义的int是基本数据类型!好吗!跟对象有毛关系哟! 484傻!
写错了。。。如果是这样呢 class Myclass { public static String str1; public static String str2; } public class Demo { public static void main(String[] args) throws Exception { Myclass s = new Myclass(); s.str1 = "111"; s.str2 = "222"; change(s); System.out.println(s.str1); System.out.println(s.str2); } public static void change(Myclass s1) { String temp = s1.str1; s1.str1 = s1.str2; s1.str2 = temp; } }
一个治疗术 2017-09-27
  • 打赏
  • 举报
回复
引用 3 楼 pany1209 的回复:
[quote=引用 2 楼 aschouas 的回复:] 楼主需要再去看一下java-数据类型....
[/quote] 为什么不用潘金莲这个名字了
一个治疗术 2017-09-27
  • 打赏
  • 举报
回复
楼主需要再去看一下java-数据类型....
绝望的奶黄包 2017-09-27
  • 打赏
  • 举报
回复
java的基本数据类型是分配在栈上的,而引用类型是分配在堆上的。 String改变的是引用地址,你可以理解。 为什么对象可以成功?因为你在对象里定义的int是基本数据类型!好吗!跟对象有毛关系哟! 484傻!

62,628

社区成员

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

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