62,614
社区成员
发帖
与我相关
我的任务
分享
public static void main(String[] args) {
String s = "old"; //这里的s相当于2L的代码的s1
change(s);
System.out.println(s);
}
public static void change(String s) {
s = "new"; //注意这里的s相当于2L的代码的s2
}
public static void main(String[] args) {
StringBuilder s = new StringBuilder("old");
change(s);
System.out.println(s);
}
public static void change(StringBuilder s) {
s.append("new"); //注意这个例子和上面的例子的区别,这里发生的不是s=这样的处理
//也就是说没有发生s指向的改变,即change里的s和main里的s还是引用同一个对象
s.append("I am the same value of s of main."); //所以这里发生的改变会影响main的s
//因为append是操作change的s所引用的对象的方法,
//而main的s也在引用这个对象,所以方法发生的效果会影响到main的s
s = new StringBuilder("change"); //注意这里,发生了s=这样的处理,也就是说改变了s的指向,
//即change里的s和main里的s不再指向同一个对象
//change的s引用了新的对象,而main的s还是引用原来的对象
s.append("I am not the same s of main"); //所以这里再发生变化,也不会影响main的s
}
String s1 = "old";
String s2 = s1; //这里就当作是s1传到方法,使得方法的参数s2=s1,
//其实就是让方法的参数指向了和方法外的s1一样的内存地址
s2 = "new"; //这里就当作是方法的参数s2改变了,
//要注意,这里是改变了s2,让它指向新的内存地址,但是s1本身没有任何改变
System.out.println(s1); //所以方法外的s1并没有变
public static void main(String[] args) {
String s = "old";
change(s);
System.out.println(s);
}
public static void change(String s) {
s = "new";
}