java 中的值传递,与引用传递

来源:互联网 发布:好牧人12网络牧养中心 编辑:程序博客网 时间:2024/05/21 09:28

个人理解:

基本类型在方法中传递参数,仅仅是拷贝的值做出改变,自身没有任何变化,所以,基本类型在作为参数传入后,自身没有任何的改变。

引用类型传入方法的是自身的地址的拷贝,如果通过对拷贝的地址所指向的对象进行操作那么对象会发生变化,因为两个地址指向的是同一个对象,如果拷贝的地址指向的一个新的对象,那么原对象是不会改变的。


值传递和引用传递的本质区别在于是否在传递的时候进行对象的内存拷贝

基本类型是由于在JVM中存储区域不同于普通对象所以传递前会拷贝,传递的是拷贝后的值,但是对象在传递的时候不拷贝,直接传“引用值”,指向同一片对象堆内存区域,当然要注意String这种特殊情况。


  1. public class Example {    
  2.     String str = new String("abc");    
  3.     char[] ch = { 'a''b''c' };    
  4.     public static void main(String args[]) {    
  5.         Example ex = new Example();    
  6.         ex.change(ex.str, ex.ch);    
  7.         System.out.println(ex.str);    
  8.         System.out.println(ex.ch);    
  9.     }    
  10.     public void change(String str, char ch[]) {  
  11.         //ch = new char[]{'a','b','c'};    
  12.         str = "change";    
  13.         ch[0] = 'c';    
  14.     }    
  15. }    

这个例子的输出为:

[java] view plain copy
  1. abc  
  2. cbc  

要知道String和char数组都是引用类型,不是基本类型。

当我们把str作为参数传入方法后,会新建另一个变量,已经不是原来的变量了,但是他们指向的数据区域都一样,所以如果你在方法中改变了str指向的数据区域,即执行str = "change",那也只是改变新建的另一个变量所指向的数据区域,即指向一个新对象"change",str仍然指向原来的数据区域。所以会输出abc

 

但是对于char数组的例子呢,即对象类型,也就是Object的子类(除了String,是把ch的引用传递进来,即引用传递。这样里面和外面的ch都指向了相同的数据区域,执行ch[0] = 'c',就会把这个数据区域里的第一个字符改成c,并没有改变内部ch的数据地址,所以这个修改也会反映到外部的ch。所以会输出cbc。如果你改变了内部ch所指向的数据区域,即把上面代码中注释的那一行打开,即执行ch = new char[]{'a','b','c'},这样ch已经指向一个新的数据区域。输出的结果肯定也就是abc了。

(1)基本数据类型传值,对形参的修改不会影响实参;
(2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;
(3)String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。