面试题的个人理解-对于String类的理解以及值传递
首先我们看看如下代码
public class StringTest1 {
static String str = new String("good");
char[] ch = {'t','a'};
public void change(String str,char ch[]){ //这里str是个变量
//由于str被final修饰,所以不可改变
str = "hello";//这里无法修改上面的str
ch[0] = 'a';
}
public static void main(String[] args) {
StringTest1 s1 = new StringTest1();
//
s1.change(s1.str,s1.ch);
System.out.println(s1.str);//good
str = "hello";
System.out.println(str);
System.out.println(s1.ch);
}
}
首先在堆空间中new了一个静态String类变量str,和一个char类型数组ch。
我们定义了一个方法change,用来改变变量值,在主函数中我们在堆中实例化StringTest1对象,调用方法。
在调用change方法后,我们输出s1.ch,输出为aa,这里是因为我们将ch传入方法后,ch[0]指向的地址值与一开始定义的ch地址值相同,所以我们输出后,ch内被改变为aa。
而当我们在调用change后输出s1.str后,值仍为good,并未改变。
首先,我们在开始定义str时是在堆空间中new了一个String类对象,此对象指向常量池中的good,我们在change方法中将str作为参数传进去后赋值hello,此时hello在常量池中被创建,指向堆空间中新的对象后指向方法中的str,所以当我们输出时仍为good。而之后我们在主函数中的hello已经在常量池中被创建,所以直接将hello指向成员变量str,所以输出str为hello。
至此本博客仅为学习过程中的个人理解,后续学习更深后会重新理解。。。如有错误请指出