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

来源:互联网 发布:sm玩法 知乎 编辑:程序博客网 时间:2024/05/21 09:05

这个问题我相信不少老鸟都解释的模棱两可,我自己也“时悟时误”我觉得大家不要纠结这个问题。
首先解释下两个名词:
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是按照什么传递的,理解本质就好了。
原创粉丝点击