java中没有指针(所以没有引用传递),方法中所有参数都是值传递, 传递的是值的副本。
1.基本数据类型传递
实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
【示例】交换两个变量的值
public class ObjectDemo {
public static void main(String[] args) {
int a = 10, b = 20;
// 输出:交换之前:a:10 b: 20
System.out.println("交换之前:a:" + a + " b: " + b);
// 交换变量a和b的值
swap(a, b);
// 输出:交换之后:a:10 b: 20
System.out.println("交换之后:a:" + a + " b: " + b);
}
// 交换两个变量的值
public static void swap(int num1, int num2) {
int temp = num1;
num1 = num2;
num2 = temp;
}
}
总结: 方法调用时,实参把值拷贝给形参,在函数中交换的是那份拷贝的值,而不是实参数据本身。所以方法内部修改形参的值, 在方法外部的实参不会跟着形参一起改变。
2.引用数据类型传递
实际参数把它的值传递给对应的形式参数,方法执行中形式参数的改变直接影响实际参数。
【示例】交换两个变量的值
// 坐标类
class Point {
// 成员变量
double x;
double y;
// 构造方法
public Point(double x, double y) {
this.x = x;
this.y = y;
}
}
// 测试类
public class PointTest {
public static void main(String[] args) {
// 创建一个坐标对象
Point point = new Point(10.0, 20.0);
// 输出:交换之前:x: 10.0 y:20.0
System.out.println("交换之前:x: " + point.x + " y:" + point.y);
// 交换point中x和y的值
swap(point);
// 输出:交换之后:x: 20.0 y:10.0
System.out.println("交换之后:x: " + point.x + " y:" + point.y);
}
// 交换坐标对象中x和y的值
public static void swap(Point point) {
double temp = point.x;
point.x = point.y;
point.y = temp;
}
}
方法调用时,实参存放的地址被传递给方法中相对应的形参,因此形参和实参都指向堆中同一块地址,在方法执行中,对形参的操作实际上就是对实参的操作。所以在方法操作形式参数,那么方法外部的实参也会跟着一起改变。
ps:如需最新的免费文档资料和教学视频,请添加QQ群(627407545)领取。