1.概念spa
值传递:方法调用时,实际传入的是它的副本,在方法中对值的修改,不影响调用者的值。code
引用传递:方法调用时,实际传入的是参数的实际内存地址,调用者和调用方法所操做的参数都指向同一内存地址,因此方法中操做会影响调用者。对象
2.问题blog
① 值传递传入的值,是它的副本是什么意思?内存
public static void main(String[] args) { int a = 0;
testValue(a); System.out.println(a); } public void testValue(int a) { a = 8; }
打印结果: 0hash
此处调用方法后,a的值依然没有变化。class
②当传入的值是一个对象时,也不会发生变化么?test
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的参数传递确实是值传递,无论是基本参数类型仍是引用类型,形参值的改变都不会影响实参的值。若是是引用类型,形参值所对应的对象内部值的改变
会影响到实参。
若有疑问或写的不恰当的地方欢迎在评论区指出!!