Java是值传递还是引用传递?

这个问题我相信不少老鸟都解释的模棱两可,我自己也“时悟时误”我觉得大家不要纠结这个问题。
首先解释下两个名词:
1、值传递:传递的是值的拷贝,也就是说传递后就互不相关了。
2、引用传递:传递的引用的地址,也就是变量所对应的内存空间的地址。
先记住这两句话:
1、Java基本类型是按值传递
2、Java引用类型是按“引用传递”

变量分为基本类型(八种数据类型)和引用类型。
一、基本类型值传递
例子:

    public static void change(int value) {
        value = 100;
    }

    public static void main(String[] args) {
        int a = 10;
        System.out.println(a); //毫无疑问 输出10
        change(a);//传的是a的值的copy
        System.out.println(a); //所以原来的a不改变 输出10
    }

    结果是:10 (回车) 10

二、引用类型引用传递

1)例子:

    public static void change(StringBuffer s1, StringBuffer s2) {
        s2 = s1;//注意哦,这是把对象s1的内存地址赋值给s2,也就是现在s2指向的是s1的数据(所以现在s1,s2指向同一内存位置)
        System.out.println(s1);//毫无疑问 输出 good
        System.out.println(s2);//同样 输出 good
        s2.append("luck");//数据改变了哦
        System.out.println(s1);//所以输出 goodluck
        System.out.println(s2);//同上哦
        s1=new StringBuffer("haha"); //新建个对象
        System.out.println(s1);//输出 haha
    }

    public static void main(String[] args) {
        StringBuffer s1 = new StringBuffer("good");
        StringBuffer s2 = new StringBuffer("bad");
        change(s1, s2);
        System.out.println(s1); //s1对象内容已经改变了,所以输出goodluck
        System.out.println(s2); //s2一直没有改变 所以输出 bad
    }

        输出结果:good good  goodluck  goodluck  haha goodluck  bad (间隔回车)

如果没搞明白可能是形参名字搞怪(好多人都这么写,难道故意迷惑人吗? -- --)
修改成下面这样:

    public static void change(StringBuffer a, StringBuffer b) {
        b = a;//b此时不代表s2了,因为它被赋值给a了并且和a指向同一对象s1(所以接下来没有对s2的修改,也就解释主函数输出s2为bad)
        System.out.println(a);
        System.out.println(a);
        b.append("luck");
        System.out.println(a);
        System.out.println(b);
        a = new StringBuffer("haha");//a指向了新的内存地址哦
        System.out.println(a);//所以输出 haha
    }

    public static void main(String[] args) {
        StringBuffer s1 = new StringBuffer("good");
        StringBuffer s2 = new StringBuffer("bad");
        change(s1, s2);
        System.out.println(s1);
        System.out.println(s2);

    }
是不是好理解点了,主函数中调用change(s1, s2)方法把对象s1和s2按照引用传递的方式,把两个对象的地址传个引用方法,也就是此时a b分别指向s1,s2在内存中的位置,也就是只要改变a或者b,s1和s2的内容就会改变。

2)、string 类型引用,string也算是引用类型中的子类,但是由于String类不可变,所以像下面例子中


    public static void change(String b) {
        System.out.println(b);//按引用传递,传递a的地址。b指向a的位置,所以输出 hi 
        b = b + " hello";//重新创建了一个对象,b指向了一个新的地址
        System.out.println(b);//所以输出 hi hello
    }

    public static void main(String[] args) {
        String a = new String("hi");
        System.out.println(a);//输出 a
        change(a);
        System.out.println(a);//a并未改变 输出 hi
    }
结果:hi   
     hi hello
     hi
其实大家不用纠结Java是按照什么传递的,理解本质就好了。

你可能感兴趣的:(Java重这一刻开始)