一、基本概念

1、值传递

在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中,这样如果在函数中对该值(形参的值)进行了操作将不会影响实参的值。因为是直接复制,所以这种方式在传递大量数据时,运行效率会特别低下。

2、引用传递

引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间,而引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象。

3、Java数据类型

Java中有两个数据类型:基本数据类型、引用数据类型。

二、基本数据类型传递

示例:

1
2
3
4
5
6
7
8
9
10
11
public class Test {
public static void change(int num){
num=50;
}
public static void main(String[] args) {
int a=10;
System.out.println("调用change方法之前 a = "+a);
change(a);
System.out.println("调用change方法之后 a = "+a);
}
}


1
2
3
输出:  
调用change方法之前 a = 10
调用change方法之后 a = 10

方法调用只修改了形式参数,对实际参数没有影响。方法调用结束后,形式参数回收。

三、引用数据类型传递

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Test2 {
public static void main(String[] args) {
Person p1 = new Person();
System.out.println(p1);
change(p1);
System.out.println(p1);
}

public static void change(Person p2) {
p2 = new Person();
}
}

/**
* Person类
*/
class Person {

}


1
2
3
输出:
Person@1d44bcfa
Person@1d44bcfa

在调用完change()方法后,Person的地址值是没有改变,变量也没有变。

四、总结

值传递和引用传递的区别并不是传递的内容。而是实参到底有没有被复制一份给形参。所以说,Java中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用。

参考:为什么说Java中只有值传递

最后更新: 2019年10月14日 23:36

原始链接: http://leiii33.github.io/2019/06/13/Java中的值传递和引用传递/