对象和变量这两个概念莫要搞乱,颈是颈,椎是椎,虽然两者都对应着一块内存,但是从不同的角度去理解内存就会产生不同的意义。
- 变量:所谓变量就是一种定义,通过定义编译器将会开辟一段空间,并将这段内存空间和这个变量的名字捆绑在一起。从这个意思去理解,其实说白了:变量名就是内存在代码中可视化的一个符号。也就是说,如int a,a只是内存中某段地址在代码中可视化的一个符号,a本身作为符号并不占用空间,占用空间的是a所对应着的那个变量,通过a这个符号我们可以引用到该变量在内存中的位置。就好比是人和名字的关系,人作为一个真真正正的实体,是占用地球的物理空间的,是一个真实的存在,而这个人的名字只是代表了这个人的一个符号,本身并没有占用地球的物理空间,只是在他妈把他生下来的时候,把人这个实体和名字捆绑在了一起,因此,我们引用这个人的名字的时候,就等于我们找到了这个人。
- 对象:对象就是内存中一段有类型的区域。从这句话的描述上来看,对象至于变量,似乎更关注的是这对内存的类型,而不是名字。不能说变量就是对象,或者对象就是变量,严格来说,对象就是用来描述变量的。一点佐证是,C++中的临时变量的概念,如传参时生成的临时变量,该变量在内存中存在,但是是没有名字的,因此在代码中无法可视化,我们就无法通过名字去引用这个临时变量。
两者的区别与联系
从上面的两个描述中我们可以看到,两者都是用来描述一段内存的,但是是从不同的角度去描述:
- 变量更强调的是变量名这个符号的含义,更强调名字与内存的联系,而不必关注这段内存是什么类型,有多少字节长度,只关注这个变量名a对应着某段内存。
- 而对象的描述更强调的是内存的类型而不在乎名字,也就是说,从对象的角度去看内存,就需要清楚这段内存的字节长度等信息,而不关注这个对象在代码中是否有一个变量名来引用到这段内存。
举例:
int a;
如果我们说a是个变量,那我们关注的只是a这个名字对应着一块内存,当我们引用a时,我们能明确的知道我们引用的是a这个名字所对应的内存空间,而不是别的,也不去关注这个a的内存是个int啊char啊之类的什么类型。如果我们说a是个对象,则我们需要知道这个对象具体是什么类型,当我们引用并操作a的时候,就能根据类型信息做一些符合类型语义的操作,而不是暴力访问内存,任意解析内存中的数据