摘自:

http://blog.sina.com.cn/s/blog_7d991ba301018xkd.html

1、 按值传递(by value)

适用范围:8种基本数据类型、String对象

特点:在内存中复制一份数据,把复制后的数据传递到方法内部

作用:在方法内部改变参数的值,外部数据不会跟着发生改变

2、 按址传递(by address)

适用范围:数组、除String以外的其他所有类型的对象

特点:将对象的地址传递到方法内部

作用:在方法内部修改对象的内容,外部数据也会跟着发生改变



=====================================================================================

对于1,8种基本数据类型与String对象,他们的值是保存在内存分配的堆区域,方法入参的时候,将参数进行了赋值了一份,所以方法内部的赋值不会对外部的变量有影响.(注意区别成员变量的赋值,作用域不一样且概念不一样)

对于2, 需要理解对象的本质,对象本身也是存储在内存分配的堆区域的,只是在内存分配的栈区域中有一个对象的首地址默默的指向了此堆区域中的对象,我们无法直接操作对象,而是通过首地址进行操作,此首地址是对堆中对象的引用.当栈中无引用堆中的对象时,JAVA的自动回收机制GC就会回收堆中的对象.因此将一个对象进行参数传递到方法中时,其实讲引用(首地址)进行的复制,复制后的首地址其实依旧指向堆中的对象,操作复制的对象依旧可以操作堆中的对象,我们一般有两种操作场景:

    1.给对象中的元素进行赋值,或者改变对象的自身属性等等,堆中的对象相应的发生变化.

    2.给对象自身进行赋值或者置为null,其实是对复制的首地址本身的操作,此时不会对堆中的对象有什么影响,只有调用了对象的方法才能操作对象.


(之前看JAVA资料时一掠而过,真心没注意这个问题,今天写代码的时候犯了这么错误,网上查了下,自己也试验了,深刻理解了.以后对于理解的东西随手写写自己博客资料,加深印象,希望以后不会出现如此低级的错误,同时对刚学习JAVA的朋友,看到我的博客时也有点帮助) O(∩_∩)O~