关于JAVA是值传递还是引用传递的问题
程序员文章站
2022-04-08 17:32:11
1.概念 值传递:方法调用时,实际传入的是它的副本,在方法中对值的修改,不影响调用者的值。 引用传递:方法调用时,实际传入的是参数的实际内存地址,调用者和调用方法所操作的参数都指向同一内存地址,所以方法中操作会影响调用者。 2.问题 ① 值传递传入的值,是它的副本是什么意思? 打印结果: 0 此处调 ......
1.概念
值传递:方法调用时,实际传入的是它的副本,在方法中对值的修改,不影响调用者的值。
引用传递:方法调用时,实际传入的是参数的实际内存地址,调用者和调用方法所操作的参数都指向同一内存地址,所以方法中操作会影响调用者。
2.问题
① 值传递传入的值,是它的副本是什么意思?
public static void main(string[] args) { int a = 0;
testvalue(a); system.out.println(a); } public void testvalue(int a) { a = 8; }
打印结果: 0
此处调用方法后,a的值依然没有变化。
②当传入的值是一个对象时,也不会发生变化么?
package com.test; public class testdemo { public static void main(string[] args) { testdemo2 testdemo2 = new testdemo2(); system.out.println("调用前:" + testdemo2.hashcode()); testvalue(testdemo2); system.out.println("调用后:" + testdemo2.hashcode()); } public static void testvalue(testdemo2 testdemo) { testdemo = new testdemo2(); } } class testdemo2 { int age = 1; }
打印结果:
调用前:366712642
调用后:366712642
这里可以看到testdemo2 的值依然没有变化,调用前后所指向的内存地址值是一样的。对传入地址值的改变并不会影响原来的参数。
③既然是值传递,为什么参数是引用类型的时候,方法内对对象进行操作会影响原来对象,这真的是值传递么?
package com.test; public class testdemo { public static void main(string[] args) { testdemo2 testdemo2 = new testdemo2(); system.out.println("调用前:" + testdemo2.age); testvalue(testdemo2); system.out.println("调用后:" + testdemo2.age); } public static void testvalue(testdemo2 testdemo) { testdemo.age = 9; } } class testdemo2 { int age = 1; }
打印结果
调用前:1 调用后:9
对于这种情况的解释是,传入的参数是testdemo2 对象地址值的一个拷贝,但是形参和实参的值都是一样的,都指向同一个对象,所以对象内容的改变会影响到实参。
综上所述:java的参数传递确实是值传递,不管是基本参数类型还是引用类型,形参值的改变都不会影响实参的值。如果是引用类型,形参值所对应的对象内部值的改变
会影响到实参。
如有疑问或写的不恰当的地方欢迎在评论区指出!!