装箱与拆箱
1 你必须要提前知道的事情
1.1 object是大哥and里氏替换原则
在了解什么是装箱和拆箱之前,必须要认识的一个代码中的大哥大“object”。是的,在代码中它是所有人的大哥,他能兼容所有的类型,他就是所有类型的父类——万物之父。说到这里不免一定要提到里氏替换原则(以下简称LSP)
众所周知,各种类型的值互相转换在敲代码过程中是不可避免的,为了避免父子纲常紊乱。(LSP)规定了:子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。
而大哥大object是所有人的父类,那么它身上就一定会出现装箱拆箱的操作。
1.2 栈内存和堆内存
- 什么是栈内存?
栈(stack)是由编译器自动分配和释放的一块内存区域,主要用于存放一些基本类型(如int、float等)的变量、指令代码、常量及对象句柄(也就是对象的引用地址)。 - 什么是堆内存?
堆(heap)是一个程序运行动态分配的内存区域,在面向对象语言中,构建对象时所需要的内存从堆中分配。这些对象通过new指令“显式”建立,这种分配方式类似于数据结构中的链表。堆内存在使用完毕后,是由垃圾回收器“隐式”回收的。(当然这两句话是博主cv过来的,毕竟是面向对象的cv工程师嘛) - 你说看不懂?
看不懂没关系,只需要记住如果一个变量存在栈内存里面就可以直接使用而在堆内存里面需new一个对象,才能使用。
2 装箱拆箱是什么?
了解了先验知识,接下来就来看看他们是什么?
装箱:值类型—–>引用类型
object x = 3;
拆箱:引用类型 —>值类型
int y = (int)x
顺便提一嘴:值类型和引用类型的区别
- 点开int和object可以看到它们的源码
发现了没有?int是struct,而object是class,这就是值类型和引用类型本质的区别。
回到正题看起来很容易是吧?那下面操作是装箱拆箱操作吗?
int x = 3;
string y = x.Tostring();
No,no,no这不是,两个例子的区别在于,前者包含了继承关系,而后者不是。也就是说没有继承关系就没有装箱拆箱。
3 为什么要有装箱拆箱的操作
这里我提供一个博主的博客,我感觉他介绍的很详细。点击这里 ,只能站在巨人的肩膀上看世界了。
总结
以上介绍了object、里氏替换原则、装箱拆箱的概念装箱拆箱的操作,在学习之前我盲目的认为,这个操作只是单纯的类型转换,没想到背后还存在着关于继承问题和内存地址的改变等等等等。可能我介绍的不够详细,有什么问题请和我交流。学无止境,加油!