public class Example { static String str = new String("good"); static char[] ch = {'a','b','c'}; public static void main(String[] args) { // TODO Auto-generated method stub Example ex = new Example(); ex.change(str, ch); System.out.print(str + "and"); System.out.print(ch); } public static void change(String str,char ch[]){ str = "test ok"; ch[0] = 'g'; } }
输出结果为goodandgbc
首先说下String确实是个不可变对象,这个不可变是JDK特有的,写JAVA的人特意针对的
但是这与本题无关,题目中的形参str只是原引用ex.str的一个引用副本,传的是一个副本地址值,这个值与ex.str地址值是不一样的,但是它们同时指向了堆中的对象new String("good"),当你在函数中改变形参也就是地址的副本值也就是这句str="test ok"只是将副本地址指向常量"test ok",并没有改变原ex.str的指向方向,它还是指向对象new String("good")的。
char数组与String一样传的也是地址的副本,但是关键是形参ch它没有新的指向 ch[0]只是ch在指向原对象时改变了对象的内部结构, 所以在ex.ch指向与它是同一个对象的情况下当然也会随之变化。