public class Example{ String str = new String("good"); char[ ] ch = { 'a' , 'b' , 'c' }; public static void main(String args[]){ Example ex = new Example(); ex.change(ex.str,ex.ch); System.out.print(ex.str + " and "); System.out.print(ex.ch); } public void change(String str,char ch[ ]){ str = "test ok"; ch[0] = 'g'; } }
A:good and abc
B:good and gbc
C:test ok and abc
D:test ok and gbc
首先我们都知道 String 和char[]都是引用数据类型,他们都会在栈中存放地址,在堆中存放的是具体的值,由栈中的值指向具体的地址。
现在我们来看题,我们现在先假设ex.str地址为0x110,它指向的是“good”,ex.char[]的地址为0x111,指向的是{‘a’,'b','c'}。现在我们通过change方法,将我们的str的值赋给了change中的局部变量str,(这个是局部变量和前面的str有区别,那个是全局变量,并不是同一个)所以它现在还是指向“good”,它的地址也是0x110,现在通过代码将局部str等于“test ok”,所以说会在堆中重新付一个值给str,即局部str的地址会修改,假设变成0x1100,指向test ok。但我们此时全局的str的地址并没有修改,还是指向“good”。再看ch,这个全局变量的ch会将值也会付给局部变量的ch,现在我们通过坐标索引改变它的值,这里记住我们是改变它的值,并没有重新赋值给他。所以堆中的{‘a’,'b','c'}就会变成{‘g’,'b','c'},此时我们全局变量的ch还是指向这个值的,所以我们的输出结果就为good and gbc。如图: