首页 > 代码库 > 值传递和引用传递

值传递和引用传递

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

 

值传递和引用传递