其实,引用传递一开始是针对C的引用类型而言的,引用传递以外,有值传递和地址传递两种(即传值和传址),因为引用传递和地址传递都能达到改变形参外的实参的效果,所以,慢慢的地址传递也开始被很多人叫为引用传递。
形参的形就是一种所谓的形式,只是用于辅助说明函数的参数的类型,并没有实际的值,当函数被调用时,函数栈产生,形参也就存在于该栈的数据区(其实就是一个相对地址),当函数调用结束,栈撤销,形参也没了。实参是函数调用时实际传给函数的参数,值传递时,实参的值被复制到函数栈的形应的形参的数据区的地址里,地址(引用)传递时,实参的地址被复制到函数栈的形应的形参的数据区的地址里,函数对形参的操作,只是针对与数据区的那个形参的地址而操作,值传递时,因为修改的是形参地址的内容,所以不会对实参产生影响,地址(引用)传递时,修改形参的属性,并不是直接就把形参的地址里的内容覆盖(因为形参地址里存的只是个地址,没有什么属性),而是先从形参地址里取出里面的内容,即形参和实参共同指向的地址,然后再对那个地址进行操作,这样,因为实参也指向那个地址,所以实参的属性也会发生改变。对于重新给形参赋值,这时是在形参的地址里重新存入一个新的地址,此时形参与实参不再指向同一个地址,所以形参的任何变化都不会对实参造成影响。这也就是为什么在函数里不能改变实参的指向的原因。
Java的参数传递完全等同于赋值运算符的操作。
给方法内的参数用等于号赋值不会改变原来参数的值。
int num=20;
String str="hello"
对于基本类型 num ,赋值运算符会直接改变变量的值,原来的值被覆盖掉。
对于引用类型 str,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象不会被改变(重要)。
如上图所示,"hello" 字符串对象没有被改变。(没有被任何引用所指向的对象是垃圾,会被垃圾回收器回收)
调用方法时发生了什么?参数传递基本上就是赋值操作。
https://zhuanlan.zhihu.com/p/27573287
JAVA在程序运行时,在内存中划分5片空间进行数据的存储。分别是:1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆。
基本,栈stack和堆heap这两个概念很重要,不了解清楚,后面就不用学了。
以下是这几天栈和堆的学习记录和心得。得些记录下来。以后有学到新的,会慢慢补充。
一、先说一下最基本的要点
基本数据类型、局部变量都是存放在栈内存中的,用完就消失。
new创建的实例化对象及数组,是存放在堆内存中的,用完之后靠垃圾回收机制不定期自动消除。
二、先明确以上两点,以下示例就比较好理解了
示例1
main()
int x=1;
show ()
int x=2
主函数main()中定义变量int x=1,show()函数中定义变量int x=1。最后show()函数执行完毕。