今天看到个面试题,突然想到java调用方法传的的String 是个类,但是修改后原来的值确不会改变,像这样----
public class Example{
String str = new String("good");
char[] ch = {'a','b','c'};
public static void main(String[] args){
Example e = new Example();
e.change(str ,ch);
System.out.println(str);
System.out.println(ch);
}
public void change(String str,char ch[]){
str = "test ok";
ch[0] = 'g';
}
}
输出结果也很明显了, 是 good 和 abc。结合了一下大佬们的知识点,可以做个比喻。
java传递只有值传递,但是这个值可以是个引用,基本类型传的是值,类则传递的是引用,但是调用方法传递的都是,对象的拷贝,也就是说char ch[]传递的就是引用拷贝。
可以把引用比喻成一个钥匙,内存中的值比喻成一个房子,(在哪看到的忘记了,大概率是某乎,哈哈,很形象的比喻),那么char ch[]传递。意思就是钥匙A可以开这个叫A的房子,现在复制了一把钥匙 A‘ 也可以开A房子,把 A’给了别人(传递),别人用A‘开了A房子,把里面的电视机拿走了,那么你用A钥匙开了A房子 也会发现里面的电视机被拿走了,这是毋庸置疑的。
这里我又做了个测试
把方法修改一下
public void change(String str,char ch[]){
str = "test ok";
ch = new char[] {'s'};
}
这样之后输出的值没有改变System.out.println(ch);还是 abc,并不是s
这个可以这样理解 给了别人A’的钥匙,但是这里new了一个新的内存地址并且让ch指向了它,那么就是造了个A’的房子,并且把A‘的钥匙拿去加工或者直接换了一把和A’的房子对应的钥匙,然后拿走了A‘房子里的电视机,但是A房子中并无改变,所以还是abc。
那么String 传递的也是引用,String = "",就是String = new String("");那么其实就是上面的原理。
唉舒服了,第一次写博客,有问题求大佬指教~~~