初开始接触Java时,可能会被问到过或者见过这个问题:Java方法参数的传递方式到底是值传递还是引用传递?
01
—
结论
先说结论:Java方法参数的传递方式是值传递。
其实要搞清楚Java方法参数的传递方式,需要先搞清楚参数是怎么存储的。
02
—
参数的存储
JVM内存模型中存在栈和堆,栈是线程私有的,每个线程都有个私有的栈,而堆是所有线程共享的。
每个方法在执行的时候都会创建一个栈帧,栈帧中的局部变量表是用来存储一组变量值的内存空间,用于存放方法参数和方法内部定义的局部变量;所以当我们做如下的代码声明时,是在栈上开辟内存空间存储的。
int a = 1;Person person= null;
但是,当我们创建对象new Person()时,会在堆中开辟一段内存空间并初始化Person对象。如果把Person对象赋给栈中的person,只是把Person对象地址赋值给person。

即:基本类型和引用类型都存在栈中,引用指向的实际对象存在堆中。
03
—
验证
代码示例:
public static void main(String[] args) {int a = 1;m1(a);System.out.println("main1 a="+a);Person person = new Person("fjh");m2(person);System.out.println("main2 name="+person.getName());m3(person);System.out.println("main3 name="+person.getName());}public static void m1(int a1){a1 = 2;System.out.println("m1 a1="+ a1);}public static void m2(Person person1){person1.setName("zs");System.out.println("m1 name="+ person1.getName());}public static void m3(Person person1){person1 = new Person("ls");System.out.println("m2 name="+ person1.getName());}
运行结果:
m1 a1=2main1 a=1m1 name=zsmain2 name=zsm2 name=lsmain3 name=zs
从m1方法执行的结果可以验证出:如果参数传递的是基本类型,是将实参的值复制到方法的形参中,即传递的是原始值的副本,操作副本不会影响原始值。
从m2方法执行的结果可以验证出:如果参数传递的是引用类型,是将实参的引用拷贝到方法的行参中,即:传递的是实参所引用的对象在堆中的地址值的副本。引用用于访问实际对象,也就意味着对形参进行修改会影响实参。
m3执行结果图解:
1)执行20行之前

2)执行20行之后:

以上分析,可以说明Java方法参数的传递方式是值传递。
-END-
如果觉得本文对你有用
请长按二维码,关注 风济海,顺便点个 在看 吧

转发至 朋友圈,是对我最大的支持
文章转载自风济海,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




