Java中的参数转递是传值?还是传引用?

Java中的参数传递是传值?还是传引用?

首先有两个概念:

1.Java中没有指针。

2.程序运行是在栈中进行的,所以参数传递时,只存在传递基本数据类型和对象引用的问题。不会直接传递对象本身。

由上得到——Java在方法调用传递参数时,因为没有指针,所以它都是进行传值调用

但是为什么会让人觉得是传引用呢?

在运行栈中,基本类型和引用的处理是一样的,都是传值,所以如果是传方法的调用,也可以理解为“传引用”的传值调用,即引用的处理跟基本类型是一样的。但是当进入被调用方法时,被传递的这个引用的值,被程序解释(或者查找)到堆中的对象,这时对应真正的对象。如果此时进行修改,修改的是引用对应的对象,而不是引用本身,即:修改的是堆中的数据。所以这个修改是可以保持的。

对象,从某种意义上说,是由基本类型组成的。如果把对象看做一棵树,对象的属性如果还是对象,则还是一棵树(即非叶子节点),基本类型则为树的叶子节点。程序参数传递时,被传递的值本身都是不能进行修改的,但是,如果这个值是一个非叶子节点(即一个对象引用),则可以修改这个节点下面的所有内容。

程序可以没有堆,但是不能没有栈。而堆是为栈进行数据存储服务,堆其实是一块共享的内存。正是因为堆和栈的分离的思想,才使的Java的垃圾回收成为可能。


为什么要把堆和栈分离出来?

第一,从软件设计角度,栈代表了处理逻辑,堆代表了数据。这样分开使得逻辑处理更加清晰。分而治之的思想。
第二,堆和栈的分离,使得堆中的内容可以被多个栈共享。
第三,栈只能向上增长,限制了栈的存储能力。而堆不同,堆中的对象可以根据需要进行动态增长,因此栈和堆的拆分,使得动态增长成为可能,相应的栈中只需要记录堆中的一个地址即可。
第四,面向对象就是栈和堆的结合。对象的属性就是数据,存放在堆中;而对象的方法,就是运行逻辑,放在栈中。在编写对象的时候,即编写了数据结构,也编写处理数据的逻辑。

猜你喜欢

转载自blog.csdn.net/xiao_ma_csdn/article/details/79802489