Java:按值传递还是按引用传递

最近看java堆栈,发现可以很好的解释按值传递还是按引用传递

首先可以明确的说只有值传递

首先了解下堆栈:

栈:存放的是java的基本变量和对象的引用

堆:存放的是对象或数组,也就是new出来的对象。

int a = 9;

这里a就是对象的引用,9就是基本变量

Person p = new Person();

这里p就是对象的引用,new Person()就是对象


程序运行永远都是在栈中进行的,因而参数传递时,只存在传递基本类型和对象引用的问题。不会直接传递对象本身

所以如果传递的是基本类型,那么传递的就是值,如果传递的是对象的引用,传递的就是引用的地址。

图一:基本类型

从控制台的结果大家可以明显的看到对于基本类型是把值传递过去了,第三次打印出来的还是10,并没有发生变化

Java:按值传递还是按引用传递Java:按值传递还是按引用传递

Java:按值传递还是按引用传递

图二:对象的引用

对象引用是把堆地址的地址值传递过去了,main方法里面的a和change方法里面的a是两个不同的对象的引用,他们指向同一个堆地址,

在change方法里面修改了这个地址对应的值,那么main方法里面的a指向的值也改变了,所以第三次打印出来的还是20。

Java:按值传递还是按引用传递Java:按值传递还是按引用传递

另外对于String来说,由于是final修饰的,所以看做和基本变量一样处理。

Java:按值传递还是按引用传递

Java:按值传递还是按引用传递