关于引用类型变量的操作的盲点

1 我们都知道, 对于引用类型的变量, 这个变量存储的是一个地址, 而不是一个值

2 正是因为这一点, 我们总以为, 不管我们对这个变量做什么操作, 都是直接操作的这个变量所指向的那个对象

3 其实, 这一点是极其错误的:

  我们应该知道, 首先, 我们不管是什么变量, 它首先是一个变量, 我们操作的永远是这个    "变量" , 一个变量存储的, 永远是一个值, 而不是一个对象, 就算是引用类型的变量, 底层也是这个变量存储的值指向这个变量引用的对象.

  对于变量的操作, 又可以分为两大类:

    改变变量:     对于改变变量, 就是我们要改变这个变量所指向的对象中的属性, 这是我们可以理解的改变变量, 但是实际上, 这并不叫改变变量, 而是叫改变这个变量所指向的对象的属性

    对变量重新赋值:  对变量重新赋值, 就是将这个变量存储的地址值改变为另一个对象的地址值, 也就是改变了这个变量的引用对象, 到这里, 还都是很好理解的, 那难理解的地方在于什么呢?

      在于函数中需要的参数是一个引用类型的参数(下面有详解)

4 函数中的参数

  对于函数中的参数, 有两种类型的参数

    值类型的参数:   就是直接将形参的值赋值给形参, 相当于在函数栈中新开辟一块存储空间, 用于存储这个变量, 这个变量存储的值就是传入的参数的值

    引用类型的参数:     我们最大的误区在于, 我们觉得当我们传入一个引用类型的变量作为一个函数的参数的时候, 只要我们对这个参数进行任何的操作, 都会直接操作到这个变量所引用的对象上面

      事实情况是, 大错特错,

      我们应该知道, 函数中的参数不管是什么类型, 它始终是一个变量, 既然是变量, 存储的就是一个值, 既然存储的是一个值, 那么就会进行值拷贝传参

      只不过是, 如果是引用类型的变量, 拷贝的值实际上一个地址值

      也就是说, 当我们给一个函数传入一个引用类型的变量作为参数之后, 整个程序中就会有两个变量存储着同一个地址值, 只不过是这两个变量的作用于不同

      如果我们对这个变量进行修改操作(其实我想表达的是对这个变量所引用的对象进行修改操作), 那么就会改变原对象的各种属性

      如果我们对这个变量进行重新赋值操作, 最终的结果是, 只是这个函数内的参数变量存储的地址值发生了改变, 这个对象的原引用变量引用的仍然是这个变量, 这一点我们需要明确.

5 反正就是, 函数中的参数不管是什么类型, 永远首先是一个变量, 既然是一个变量, 那么传参的时候, 永远是进行值拷贝赋值, 子函数栈中一份变量, 父函数栈中一份变量, 对任何一个变量进行重新赋值操作, 都不会改变另一个变量的存储值.

posted @ 2021-03-15 19:03  0龙行者0  阅读(84)  评论(0编辑  收藏  举报