Java的引用传递和值传递

来源:互联网 发布:济宁预算软件 编辑:程序博客网 时间:2024/05/03 21:53

Java的引用传递和值传递

今天组长问我Java的值传递和引用传递分别是什么,写出个例子比较一下。刚开始想没什么难的,问度娘啊,不搜不要紧,一下子弄懵逼了。好多文章上来就说Java没有引用传递,只有值传递,坑爹啊,本来是明白的只是抄个代码而已,弄得自己都不知道怎么办了。搜了一下午,结合别人的思路自己总结了一下,关于Java的值传递和引用传递。

直接上代码(有点简单,大家将就看吧):
package com.passBy;public class PassBy {    //test1演示的是值传递    public int test1(int num)    {        num = 10;        return num;    }    //test2演示的是引用传递    public void test2(Student stu)    {        stu.age = 20;    }    public static void main(String[] args) {        PassBy passby = new PassBy();        int value = 0;        passby.test1(value);        System.out.println("值传递:    " + passby.test1(value));        //引用传递前先创建引用student        Student student = new Student();        passby.test2(student);        System.out.println("引用传递:   " +student.age);    }}
package com.passBy;public class Student {    int age = 15;}

test1是值传递的方法,大家都能看得懂。实际就是把value=10拷贝进方法test1中,拷贝这个词很重要,他只是把10这个值传进去,互不影响,拷贝的是值,与其他无关。

test2是引用传递,刚开始我没搞清引用是什么,弄得自己很难受。

举个例子:
Student student = new Student();
student就是引用
new Student()是对象

这时候你在看test2代码,你就豁然开朗,我擦这么回事,区别是这个样子。这时候咱们来点高深的,前面说到值传递,只是将值拷贝传递下去。引用不一样,引用指向的是一个内存地址,将它传递下去,你对他修改就会有影响,因为前后引用都指向一个内存地址。

网上关于Java是不是只有值传递,我是这么理解的,引用传递,传递的是一个内存地址。这个内存地址是一个值的形式传递的,传递的是一个值,所以Java只有值传递。我的看法是,没必要弄得那么死板,我觉得还是有点区别的,毕竟两种方式在内存方面分配是有些不同的,我们不能弄的太形而上学,那么较真,知识是不断进步的,有个发展的眼光也是不错的。

下面我们在谈一谈两种方式的使用,基本类型都是值传递,注意String类型虽然不是基本类型,但他的使用有些特别貌似也是值传递(我也是个菜鸟,没看太明白),其他的是引用传递。

对于引用分配我推荐一个博客,地址http://yqsshr.blog.51cto.com/469059/147695/。
当中内存分配那段讲得很好,让我豁然开朗。

引用和对象我看的是百度经验,地址http://jingyan.baidu.com/article/a501d80cf734c3ec630f5e25.html

这是我的很烂的总结与归纳,有不妥之处请大神指教,我来起个抛砖引玉的。


0 0