今天看题的时候看到了这么一道题:
当一个对象被当做参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递呢?
这题如果对Java参数传递机制有了解的人就很简单了,因为Java中只有值传递,没有引用传递。但是如果刚从C转Java的人眼里,这题就很有迷惑性了。
对于8中基本数据类型一般没有什么争议,值传递就是将实参栈中对应的变量数据复制一份给形参,之后形参使用的一直是复制的那一份 ,不会影响到实参。
有比较大争议的就是很多人不理解,为什么用对象当参数,明明调用的时候修改的改变有影响到实参,但是还是说是值传递呢?
首先会出现这个疑惑是因为对值传递和引用传递的一个概念上的误解,大多数人对值传递和引用传递的一个主要区分方法是看传参后能否会在方法中改变值后对实参造成影响,但是实际上这两种参数传递机制在Java中的区别方式根本不是这样的!
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
但是在Java中,你将一个对象当参数传入方法中的时候,传入的是栈中该对象引用的复本,引用相当于地址,所以修改改引用内的值会引起所有指向该引用的值得改变。本质上还是值传递的。
简单的举个例子?:
以上均自己见解 ,如有错误欢迎指正~