JVM会为每一个加载的class建立一个叫做“方法区”的运行时内存空间。每个类的常量池以特有的数据结构(不同JVM实现的形式不同)存放在对应的方法区中。另外,JVM的每个线程都有自己的Java栈,当线程调用某一个方法时就会创建一个"栈帧"压入Java栈中。栈帧中就有局部变量区和操作数栈,因此方法见参数传递,实际上是从某一个栈帧的局部变量区中取出值存放在新堆入的栈帧的局部变量区中。也就是“值传递”。PS1: 《Thinking in Java》并不适合初学者,而且太啰嗦了。它恨不得把J2SE的所有技术(包括JVM)都写进去。搞得读起来很伤心。ps2: 我个人很反对两个计算机术语:值传递call by value,引用传递 call by reference。这两名字取得太烂了。应该叫做“相同内存空间的值传递”和“不同内存空间的值传递”,这样就恰当些。
ls,传递严格来说应该是pass by XXX,还有不同内存空间是什么?
实参和形参是否都是同一块内存区域。比如C++中的"别名"传递就是指引用传递,而C++的指针以及Java的引用都是值传递。我个人感觉很多人误认为引用传递是指传递“地址”,都是因为这个叫做“call by reference”的名字造成的。http://hxraid.javaeye.com/blog/428856
是把对象的引用的值传过去的
即 传进去的是 对象在堆中的地址
所以java里有“不能改变参数的值,只能改变参数的属性值”一说
java里没有引用传递