01.什么是值传递和什么是引用传递?
值传递(pass by value)是指在调用方法时将实参复制一份传递到方法中,这样当方法对形参进行修改时不会影响到实参。
引用传递(pass by reference)是指在调用方法时将实参的地址直接传递到方法中,那么在方法中对形参所进行的修改,将影响到实参。
从上面的定义来看,在传递参数到方法执行过程中,值传递不能通过更改形参,而改变实参,引用传递可以通过更改形参而更改实参,说白了就是,值传递中形参和实参是复制的关系;而在引用传递中,形参和实参共用内存 。
大多数人可能认为Java传基本类型时是值传递,传对象时是引用传递但这是错误的理解!!!
下面请看示例:
(1)Java中基础类型传递
解析:
如图可看出a,b 的值进行交换,并没有影响到 n1、n2。因为a、b 中的值,只是从 n1、n2 的复制过来的。相当于 n1、n2 的副本,副本的内容无论怎么修改,都不会影响到原件本身。所以Java中基础类型传递是值传递。
2.Java中对象传递
解析:
交换前:
交换后:
此时name 是引用类型,变量中保存的只是对象的内存地址
方法并没有改变存储在变量 s1 和 s2 中的对象引用指向。 而只是把拷贝副本的指向进行了交换,原实参s1、s2并未改变
02.
值传递和引用传递的关键区别有两点:
1.调用方法时有没有对实参进行复制。
2.方法内对形参的修改会不会影响到实参。
总结:
基本类型作为参数被传递时肯定是值传递;引用类型作为参数被传递时也是值传递,只不过这个值,实际上是对象内存地址的引用。在Java中,无论是基础类型传递还是对象传递,总是按值传递的。