今天复习Java基础,发现有一个概念好像有点模糊了,就是值传递,Think in Java中说Java只有值传递。
上网看了好多的博客分析,各有各的说法,有的说只有值传递,有的说有值传递和引用传递,争论的焦点就是对象的传递。
系统的说一下:Java中有2种参数传递,一种是基本类型参数,一种是引用类型参数。
基本类型参数的传递方式基本没有什么争论,即:Java应用程序中在传递基本类型参数时会copy一份值,因为基本类型的值是存在栈中的,也就是当你在方法中改变参数的值是不会影响调用者的值的。
引用类型参数的传递方式有争论:我认为是引用传递,但是从严格意义上来讲,引用也是栈中的值,引用指向的堆中的对象就是值。不管怎么样,引用类型的参数传递就是引用传递,但是那个引用指向的堆中对象还是调用者的对象,所以也可以理解为值传递。
引用一下一位同学的话:
“其实按值还是按引用的区别在于‘是否在传递的时候进行对象的内存拷贝’,java中基本类型是由于在JVM中存储区域不同于普通对象所以传递前会拷贝,传递的是拷贝后的值,但是对象在传递的时候不拷贝,直接传“引用值”,指向同一片对象堆内存区域。”
在编写Java应用程序时,需要注意传递基本类型参数时不能在方法中赋值,因为这可能得不到你想要的结果。
ps:注意string类和包装类的final属性。虽然是引用类型,但是每当改变它们的时候都会创建新的对象。所以和基本类型的结果是一样的。
欢迎指正。