ref 关键字传递栈地址
引用类型传递的堆的地址
引用类型的对象或实例存储在堆上,而栈上存储的是指向放对象的堆的地址(栈上放了个地址,这个地址是对象在堆上的存放位置)
不加ref关键字时,我们传递的引用类型,其实是一个指向堆的地址,method(A a);(即 栈里面存的那个地址)
当我们在方法里面进行操作时,比如 A b = a;其实是将a的地址放到了一个新的栈的位置上,此时,栈上有两个位置都放着a的地址,当我们传递b时,同样的是传递了指向堆的那个地址。我们对堆里面的对象进行修改,所有存放堆这块地址的引用的对象都会发生改变。
加上ref 就不会重新分配栈的地址。
method(ref a); 此时,如果将a指向两一个对象,即a的地址成为另一个对象在堆中的地址,那么,栈中存放的地址也就变了。
而不加ref,修改b 指向的对象,只是修改了复制出来的栈里面存放的地址。而原来的不变
比如:
将一个数组引用传入一个方法,我们是不能修改传入的引用的地址的,因为,只是传入了一个拷贝,在外面打印地址,会返现没有变化
而,当我们添加ref后,再进行 a = newAddr时,原来的对象就已经变了。