3. 指出下列程序运行的结果 () 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 答案:B 今天面试官问我为什么是B,我说基本类型是值传递,引用类型是引用地址传递。 要求我详细说明一下为什么是“good”。我的天,脑子想了半天愣没想出来。 做了个图:
网上详细说明: 有的说“因为在java里没有引用传递,只有值传递”,这句话解释一下: 对于基本类型,传递的是基本类型的值,而对于引用类型传递的是地址。 所以无论是什么,传递的都是值,因为你可以把地址理解成9x0000这种,也是一个值。 所以传递的都是值。 那么方法中什么时候会改变原来的值,什么时候不会呢? 1、只要是基本类型,传递的是值,这个值是复制了一份出来的,所以怎么都不会改变。 2、引用类型,传递的是地址,如果这个地址变了,那么原来的值肯定不变。 3、引用类型,传递的是地址,如果地址没变,而改变了地址对应的对象的属性,那么久会改变原来的值。 如果还听不明白,那么简单的说,只要在方法里面把传进来的对象重新赋值一个new的对象,那么原来是不变得。 如同方法中的string,重新赋值了一个字符串,这个时候地址以及改变了,所以原来那个不变。 而char数组,没有重新复制一个新的char数组,而是把char数组中的元素改变了,那就会改变原来的值。 参考:http://www.cnblogs.com/linkstar/p/5951141.html 如果还困惑,看下面简单例子: public class FooString { public static void main(String[] args) { String a = "A"; String b = "B"; operate(a,b); System.out.println(a+ "," + b); } static void operate(String x, String y) { y+=x; System.out.println("y=" + y); System.out.println("x=" + x); y=x; System.out.println("y2=" + y); } //a - A //b - B //当y = x时,改变了y的引用指向,并没有改变b的,也就是 //y - 内存A //对b的内存没有影响 } 输出结果: y=BA x=A y2=A A,B