了解过Java中方法的读者都知道,Java中的方法必须使用类或对象来调用,然后才能执行。 如果问Java中方法的参数传递机制,很多朋友都会回答:包括引用传递和值传递。 但如果需要分辨它们之间的区别,有的朋友说有点傻,分不清,所以这篇文章就来一一揭秘!
如果Java中的方法在声明时包含形参声明,那么在调用该方法时就需要为这些形参指定参数值。 这些传递给形式参数的参数值也称为实际参数。 事实上,Java中传递方法参数的方式就是值传递。
下面的例子演示了方法参数传递的效果。
public class Test01 {
public static void main(String[] args) {
int a=66;
int b=88;
swap(66,88);
System.out.println("main方法中,a="+a+",b="+b);
}
public static void swap(int a ,int b){
int tmp=a;
a=b;
b=tmp;
System.out.println("swap方法中,a="+a+",b="+b);
}
}
(左右滑动查看完整代码)
你认为运行上述代码的结果是什么? 相信大部分小伙伴都能说出下面的运行结果。
交换法中,a=88,b=66
main方法中a=66,b=88
从上面的运行结果可以得出结论,当调用该方法时,会将实参值的副本传递给相应的形参。 此时,形参接收到的实际上只是实参值的副本。
Test1的运行流程如下图1-2所示。
图1 main()方法中的实际参数传递给swap()方法
图2 swap()方法中a和b值的交换
整个运行过程中,main方法的栈区中变量a和b的值没有发生变化。 当调用方法swap()时,将主方法栈区中的变量a和变量b的值分别赋值给交换栈区中的变量a和b,然后将变量a和变量的值赋值给交换栈区中的变量a和b。 swap方法中的变量b被交换。
前面我们看到的是基本类型的参数传递。 接下来我们将演示引用类型的参数传递。
class Data{
public int a;
public int b;
}
portant;overflow-wrap: break-word !important;">
public class Test02 {
public static void main(String[] args) {
Data dt = new Data();
dt.a=66;
dt.b=88;
swap(dt);
System.out.println("main方法中,dt.a="+dt.a+",dt.b="+dt.b);
}
public static void swap(Data dt){
int tmp=dt.a;
dt.a=dt.b;
dt.b=tmp;
System.out.println("swap方法中,dt.a="+dt.a+",dt.b="+dt.b);
}
}
(左右滑动查看完整代码)
对于上面的案例,相信小伙伴的运行结果有很多答案,真实的运行结果如下。
swap方法中,dt.a=88,dt.b=66
main方法中,dt.a=88,dt.b=66
有的朋友会说,那不是说方法的参数传递都是值传递吗? 为什么基本类型的参数传递结果与引用类型的参数传递结果不同?
事实上,方法的参数传递确实是值的传递,但是当基本类型作为实参时,传递的是实参值的副本,而当引用类型作为方法时参数,传递的是对实际参数的引用。 操作流程如图所示。
工作流程
main方法创建一个Data对象,并通过变量dt引用Data对象,变量dt存储了Data对象的引用(地址值); 然后在main方法中调用swap()方法,将dt的值(即Data对象的地址值)赋值给swap()方法的变量dt。 此时swap()方法中的dt还保存了Data对象的地址值。 此时,无论是在main方法中修改变量dt,还是在swap()方法中修改dt,都会修改Data对象的属性。
一般来说,无论传递基本类型还是引用类型,Java中的方法参数传递方式都是值传递,只不过基本类型传递的是实际参数值的副本,而引用类型传递的是对象的地址值。
8月份资源更新
回复【0】获取2021年暑期教师培训信息