1. JAVA只有值传递

JAVA没有引用传递,因为Java把地址的值传递理解成值传递。JAVA的地址值传递实际上和C/C++中的指针是一个概念,传递过去的是地址值(这里是拷贝了一份地址值传递,所以说JAVA是值传递)。那么在函数中修改相同地址值中的内容,那么原来对象的内容的值也会改变。因此JAVA只有值传递,对熟悉C++指针的人来说,还是挺容易搞错的,比如我,哈哈。为了避免搞错,我们可以把JAVA中的地址值传递和普通的值传递分开理解。地址值传递等价于C++中的引用传递,普通的值传递等价于C++中的值传递。下文中所有出现的值传递,均指除了地址值传递以外的值传递。

2. 结论

JAVA的基本数据类型都是值传递,其他对象都是地址值传递。String 是地址值传递,但是因为创建新的String对象都是重新申请一个新常量放到常量池中的。所以看起来的效果和值传递是一样的,它就是这么特殊!

3. 代码验证

/**
 * Created by Kaiming Wan on 2015/10/13 0013.
 */



public class TestValue {

    private static boolean change(int a,double b,char c,String s,char[] word){
        a=11;
        b=22;
        c='z';
        s="not good";
        word[0] = 'f';
        System.out.println("调用change时的输出结果  "+"int:"+a +",double:"+ b +",char:"+ c +",String:"+ s +",char[]:"+ String.valueOf(word)+",char数组地址"+word);
        return true;

    }

    public static void main(String[] args){
        /*基本类型都是值传递,每次传递都是一次新的赋值,然后产生了一
        个新的副本,虽然内容一样,但是内存地址不同,所以修改也对原值不产生影响。特殊的String也同样有值传递的特征*/
        int a = 1;
        double b = 2;
        char c = 'c';
        String s = "good";
        char[] word = {'w','o','r','d'};
        System.out.println("调用change前的输出结果  "+"int:"+a +",double:"+ b +",char:"+ c +",String:"+ s +",char[]:"+ String.valueOf(word)+",char数组地址"+word);
        change(a, b, c, s, word);
        System.out.println("调用change后的输出结果  "+"int:"+a +",double:"+ b +",char:"+ c +",String:"+ s +",char[]:"+ String.valueOf(word)+",char数组地址"+word);

    }

}

输出结果:

/**
调用change前的输出结果  int:1,double:2.0,char:c,String:good,char[]:word,char数组地址[C@4554617c

调用change时的输出结果  int:11,double:22.0,char:z,String:not good,char[]:ford,char数组地址[C@4554617c

调用change后的输出结果  int:1,double:2.0,char:c,String:good,char[]:ford,char数组地址[C@4554617c

**/