Java中所有函数的参数传递方式都是传值,不存在传引用的,理解这句话首先要理解Java中所有对象都是指针,传递指针当然是传值了。
Java定义对象的方式和C++以下方式相同
//JAVA
Person a = new Person("name",14)
//C++
Person * a = new Person("name",14)
下面以swap函数为例来解释Java的参数传递机制,解释为什么Java不是传引用
- 人类
class Person{
public string name;
public int age;
}
分别实验用java和c++完成交换任务,交换后a,b值互换
Person a = new Person("Jack",13);
Person b = new Person("Bob",14);
swap(a,b)
- java的swap函数,不能完成交换工作
main(){
Person a = new Person("Jack",13);
Person b = new Person("Bob",14);
swap(a,b);
}
void swap(Person p1,Person p2)
Person temp = p1;
p1 = p2;
p2 = temp;
)
- c++的传引用版本的函数,可以完成交换工作
main(){
Person a = Person("Jack",13);//注意没new
Person b = Person("Bob",14);
swap(a,b);
}
void swap(Person & p1,Person & p2)
Person temp = p1;
p1 = p2;
p2 = temp;
)
用栈帧来分析原因
-
java的栈帧过程
-
c++的栈帧