字符串交换的问题
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;
}
}
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;
}
}
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;
}
}
第一种方式,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"的引用时有什么不同吗
方法一我改变了a1,b1指向的地址,对输出实参a,b没有影响。可是在s2中我改变的也是s1,输出的也是s呀,为什么引用s1的改变会影响到s呢。s.a="A"与s="A"在对对象"A"的引用时有什么不同吗
方法1中你交换了a1,b1的地址,而不是a1,b1地址的值。所以a,b输出不受影响。
方法二你改变的是s1的值,但是并没有改变s1的地址,所以s1和s还是同一个引用。
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;
}
string s=new string()方式定义的字符串对象内存地址分配在堆上