我们先来看一段代码:
package com.ykp.test;
public class StringTest {
public static void main(String[] args) {
String str = "TEST";
change(str);
System.out.println(str);
}
public static void change(String str) {
str = str.replace('S', 'E');
str = str.substring(1);
}
}
最终输出的结果是:TEST
面试的时候,答案我是写对了,但是当问我为什么输出这样时,我说因为change中修改的和main中修改的不是一个对象。然后接着又问,那如果代码修改成下边这样呢:
再看下面的代码:
package com.ykp.test;
public class StringTest {
private String name;
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
StringTest str = new StringTest();
str.setName("TEST");
change(str);
//输出sbsb
System.out.println(str.name);
}
public static void change(StringTest str) {
//str代表的是StringTest对象,StringTest的属性值是可以修改的,
//再加上我们接下来有没有new StringTest(),所以此处的str和main中的是同一个
str.setName("sbsb");
}
}
按照我的解释,change中修改的和main中的不是一个对象,岂不是要输出“TEST”了吗?可见我的解释是错误的。
正确的解释应该是:
public static void main(String[] args) {
//str是一个字符串,其值是不可修改的
String str = "TEST";
change(str);
//这句话输出的还是期初创建的那个对象的值
System.out.println(str);
}
public static void change(String str) {
//在进行下面这行代码之前,str的内存地址还是main中的那个
//replace函数最终会创建一个新的对象返回给str,此时的str的内存地址已经是另一个对象的了
str = str.replace('S', 'E');
//substring函数又创建了一个新的string对象
str = str.substring(1);
}