Java 形参传递机制
形参细节补充
形参传递机制
如果前面的基本类型和引用类型学明白了,这一部分很简单。
- 在执行类方法的时候,
JVM
会开辟临时栈,这个临时栈
与main栈
是相互独立的,临时栈
中无法获取到main栈
中的任何变量,反过来也一样。 - 外界传入方法的实参,在执行的时候,相当于在临时栈中创建了一个变量,这个变量的名字就是形参名字,如果传入的是基本类型,则会将传入的实参进行值拷贝。如果传入的实参是引用类型,则会将这个变量指向这个引用类型的内存地址。
- 一旦方法内部的这个形参变量与这个引用类型断开,后续的任何操作都与外界传入的实参无关。例如:
- 传入的实参是一个数组,相当于在这个类方法创建了一个变量,变量名字就是这个形参的名字
- 并将这个变量指向这个实参的内存地址
- 现在我们断开与实参的引用
int 形参名字[] = {1, 2, 3}
- 这个操作相当于在堆空间中重新开辟一个新的数组,并将这个形参变量指向这个新的数组。我们就彻底和外部这个数组失联了,我们后续操作的都是我们新创建的这个数组,且因为栈与栈之间是独立的,我们也无法重新获取外界这个数组。
如果觉得上面不好理解可以看看下面这段代码
int array[] = {1, 2, 3}; // 假设下面是一个方法 int newArray[]; // 假设这是这个类方法的形参 // 假设现在执行的这个方法, // 并将array作为实参传递给了这个方法 newArray = array; // 我们在这个方法里创新定义了一个数组 newArray = {1, 3, 5, 6}; // 现在newArray与 array已经没有任何联系了
上面这段代码只是为了更好理解形参的传递机制,并不是真正的传递机制,因为在执行成员方法的时候 JVM
会开辟新的栈空间,栈与栈之间是相互独立的,如果断开了与外界的联系,那么你在方法体内是无法获取任何main栈
中的变量的。
如果上面这段代码还是没能看懂的还是建议回去把基础打好