java试题
java试题代码:
String str = new String("good");
char[] ch = {'a','b','c'};
public static void main(String[] args) {
T3 t = new T3();
t.change(t.str, t.ch);
System.out.print(t.str+"and");
System.out.print(t.ch);
}
public void change(String str,char ch[]) {
str="test ok";
ch[0] = 'g';
}
输出结果:
结果分析
为了方便区分,将代码中change方法的参数名改为str2 和ch2.
先上堆栈示意图:
分析:
1.程序从main方法开始,先在堆中创建包含str和ch的对象,在栈中由t保存指向这个对象的地址,其中str指向“good”(str在堆中指向两个对象,一个是常量池中的“good”,一个是新建的对象中的“good”),ch指向char数组中的数据。
2.第二步,有t调用change方法,这时实质是在栈中新建str2和ch2分别指向对象t中的“good”和char数组。此时,在change方法中,str2改为指向“test ok”,char数组中的第一个元素ch[0]改为‘g’。
3.当程序输出时,调用的任然是str指向的“good”,而不是str2指向的“test ok”,所以程序输出的结果是“good”。而ch和ch2都指向char数组中的数据,在change方法,ch2指向的char数组的第一个元素改变,所以程序输出时char数组的数据已经改变,所以输出“gbc”。