参数传递
约 555 字大约 2 分钟
2025-03-04
形参和实参
形参
就是形式参数,用于定义方法的时候使用的参数,是用来接收调用者传递的参数的。
实参
就是实际参数,用于调用时传递给方法的参数。实参在传递给别的方法之前是要被预先赋值的。
值传递和引用传递
值传递
传入实参的值,不会影响到实参,值传递传递的是副本
public static void main(String[] args) { int num1 = 10; int num2 = 20; swap(num1, num2); System.out.println("num1 = " + num1); System.out.println("num2 = " + num2); } public static void swap(int a, int b) { int temp = a; a = b; b = temp; System.out.println("a = " + a); System.out.println("b = " + b); }
- 可以看出a,b就是num1,num2的副本而已
引用传递
- 实参的实际地址,会影响到实参
Java基本数据类型是存储在虚拟机栈内存中,栈中存放着栈帧,方法调用的过程,就是栈帧在栈中入栈、出栈的过程。
Java参数传递的额过程中,不管传递的是基本类型还是引用类型,都是值传递
案例:引用传递
public class Person {
private String name;
// 省略构造函数、Getter&Setter方法
}
public static void main(String[] args) {
Person xiaoZhang = new Person("小张");
Person xiaoLi = new Person("小李");
swap(xiaoZhang, xiaoLi);
System.out.println("xiaoZhang:" + xiaoZhang.getName());
System.out.println("xiaoLi:" + xiaoLi.getName());
}
public static void swap(Person person1, Person person2) {
Person temp = person1;
person1 = person2;
person2 = temp;
System.out.println("person1:" + person1.getName());
System.out.println("person2:" + person2.getName());
}
输出结果:
person1:小李
person2:小张
xiaoZhang:小张
xiaoLi:小李
person1,person2是xiaoZhang和xiaoLi的拷贝了地址而已,所以,方法里面交换的只是拷贝后的地址,并不是对原来的对象进行修改,所以java中只有值传递
引用传递是怎样的?
- 在c++中可以实现引用传递,从而修改原来的值,
c++引用传递案例:
#include <iostream>
void incr(int& num)
{
std::cout << "incr before: " << num << "\n";
num++;
std::cout << "incr after: " << num << "\n";
}
int main()
{
int age = 10;
std::cout << "invoke before: " << age << "\n";
incr(age);
std::cout << "invoke after: " << age << "\n";
}
输出:
invoke before: 10
incr before: 10
incr after: 11
invoke after: 11
为什么java中不引入引用传递
- 安全问题,为了保证接口里面的方法不被外界随意更改
- 使程序更加简单