变量的本质和New操作
所有的变量都有一个指针指向栈中的地址,不同的是简单数据类型的变量栈中存储的是操作数本身,而复杂数据类型存储的是在堆中的对象地址。
而垃圾回收的机制主要是在堆中运行,没有引用的对象会被回收。
值类型的Ref
我们都知道Ref是调用函数传递参数时 值传递和引用传递的标志 ,那么针对值类型和引用类型Ref有什么区别呢?用最简单的实例调试来说明
值类型的直接调用
在下面这个实例中我们看到 变量 a和m的地址和值都不同 ,因此值类型的直接调用是变量a复制了m的值 并对a 操作,对原来的变量m没有任何影响(变量的地址并不相同)。
值类型的ref传递
值类型的Ref传递:调试后发现a和m地址一致,即变量a 和变量 m 的地址码指向stack中的同一地址
直接寻址: 指令的地址码字段指出的不是地址,而是操作数本身,这种寻址方式称为立即寻址方式。立即寻址由于在取出指令的同时也取出了操作数,所以指令的执行速度很快。但由于操作数是指令的一部分,不便于修改,降低了程序的通用性和灵活性。因此,立即寻址方式只适合于操作数固定的场合,通常用于为主存单元和寄存器提供常数。
m和a中地址码指向的是stack中的操作数 因此a的操作就是操作数的变化
引用类型的值传递和引用传递
引用类型的值传递:p1 和 p 本身地址码指向栈地址 在这个栈空间中存储是引用类型的地址
在值传递的情况下p1和p指向的栈地址不同 但是栈地址中的值(即指向堆中的Person实例的地址是相同)因此P1会改变,
只有在new 对象的时候 才会在堆中 分配空间 产生对象
引用类型的引用传递
p和p1指向的栈地址相同 栈中的数据(指向堆的地址)也相同
间接寻址方式:与直接寻址方式相比,间接寻址中指令地址码字段所指向的存储单元中存储的不是操作数本身,而是操作数的地址。因此,间接寻址方式需要多次访问主存储器,既增加了指令的执行时间,又要占用主存储器单元。但是,这种寻址方式也为编程人员带来了较大的灵活性,实现起来也很简便,而且,间接寻址指令可以访问较大的存储空间,从而扩大指令的寻址能力。由于地址码位数的限制,如果采用直接寻址方式,能够访问的存储空间十分有限,而间接寻址的地址码所指向的存储单元则有足够的位数,因此可以访问全部存储空间。
结论:
综上所述 必须清楚的一点即声明的所有的变量的变量指针都是指向stack中的, 不同的是 ,值类型的变量的stack数据是操作数本身 而引用类型的stack 数据是指向(heap)堆中的引用地址。
因此 对于引用类型来说 就没有ref和非ref之分,因为指向的堆中的对象都是同一个,对该对象的操作,都是同一个对象。