在正文开始之前,我们先了解一下值传递和引用传递(定义)
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。
正文开始:
关于Java方法参数是值传递还是参数传递,首先我们应该明确的是值传递的。下面我们看一下例子:
public class StudentTest {
public void test1(){
Student student=new Student();
student.setName("千千");
ClassInfo classInfo=new ClassInfo();
classInfo.setName("5班");
}
public static void main(String[] args) {
Student a = new Student();
Student b = new Student();
a.setName("千千");
b.setName("尔尔");
//初始情况下输出a和b,a就是 千千,b就是 尔尔
System.out.println(a);
System.out.println(b);
//新调用了一个方法,所以引入新的栈帧
swap1(a,b);
System.out.println("=============分割线=============");
System.out.println(a);
System.out.println(b);
swap2(a,b);
System.out.println("=============分割线=============");
System.out.println(a);
System.out.println(b);
int c =10;
int d=20;
Integer e =10;
Integer f=20;
swap3(c,d);
System.out.println("=============分割线=============");
System.out.println(c);
System.out.println(d);
swap4(e,f);
System.out.println("=============分割线=============");
System.out.println(e);
System.out.println(f);
}
private static void swap1(Student e, Student f) {
String name = e.getName();
e.setName(f.getName());
f.setName(name);
}
private static void swap2(Student e, Student f) {
Student aa= e;
e=f;
f=aa;
}
private static void swap3(int a, int b) {
int c =a;
a=b;
b=c;
}
private static void swap4(Integer a, Integer b) {
Integer c =a;
a=b;
b=c;
}
}
这个代码在我没有运行之前,自己做出来的答案是:
千千 尔尔
尔尔 千千
千千 尔尔
20 10
10 20
但运行之后这个答案是错的,
运行的结果是:
下面我们分析一下
首先是第一个的输出,就是千千 尔尔,没有做任何的交换
第二个的输出:
之后方法执行完毕之后,方法里面的变量出栈,结果为:
第三个的输出:
结果就是:尔尔 千千,相对于第二个的输出没有改变
再看第四个和第五个的输出,是相同的道理:
我们再看一下相关的代码,其调用的方法
private static void swap3(int a, int b) {
int c =a;
a=b;
b=c;
}
private static void swap4(Integer a, Integer b) {
Integer c =a;
a=b;
b=c;
}
在方法中,都是新引入了一个int a,int b或者是Integer a, Integer b,这是对引入的变量进行了数值交换,在方法执行完毕之后,变量就会出栈,不会对之前的值产生任何的影响,所以他们的输出都是10 20。
这个例子我们可以清楚地java是值传递。
举例证明完毕~~~