一:值传递
解释:在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中,这样如果在函数中对该值(形参的值)进行了操作将不会影响实参的值。因为是直接复制,所以这种方式在传递大量数据时,运行效率会特别低下。
代码示例
package arrayDemo;
public class Demo1 {
public static void main(String[] args) {
int b =20;
change(b);// 实参 实际上的参数
System.out.println(b);
}
public static void change(int a){//形参 形式上的参数
a=100;
}
}
结果:20
为什么?看下面分析:
通俗的讲法就是:形参只是实参创建的一个副本,副本改变了,原本当然不可能跟着改变;
二:引用传递
解释:引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间,而引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象。
package arrayDemo;
public class Demo1 {
public static void main(String[] args) {
int [] a={1,2,3};
System.out.println(a[0]);
change(a);
System.out.println(a[0]);
}
public static void change(int[] a ){
a[0]=100;
}
}
结果:1 100
为什么?
由于引用传递,传递的是地址,方法改变的都是同一个地址中的值,
原来a[0]指向0x13地址,值是1,
后来在a[0] 指向的也是0x13地址,将值变成了100
所以,再查询a[0]的值的时候,值自然变成了100
结论:
- 基本数据类型传值,对形参的修改不会影响实参;
- 引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象。常见的引用类型:类类型,接口类型和数组。
- String, Integer, Double等immutable的类型特殊处理,可以理解为值传值,最后的操作不会修改实参对象。