值类型和引用类型
数据类型分为两种:值类型和引用类型,这两种类型的对象在内存的存储方式不同。
定义:
引用类型:表示操作的对象是同一个,即当传一个参数给另一个方法时,在另一个方法中改变这个变量的值,那么调用这个方法时传入的值也将发生变化。
值类型:表示复制一个当前变量传递给方法,在方法中改变这个值时,最初生命的变量值不会改变。
值类型
值类型及基本数据类型,常被分为四类八种:
四类:整型,浮点型,字符型,逻辑型
八种:1,整型3种 byte, short, int, long
2,浮点型 float, double
3,字符型 char
4,逻辑型 boolean
引用类型
除了四类八种的基本类型,其他数据类型都是引用类型,例如:string类型,object类型等。
传递:
值传递:基本数据类型复制都属于值传递。传递的是实实在在的变量值,是原参数的拷贝,实参传递给形参的值,形参发生变化而不影响实参。
引用传递:引用类型之间的赋值属于引用传递。传递的对象是引用的地址,即将实参的地址传递给形参,形参改变了实参也相应发生变化,因为指向同一个地址。
存储:
1. 值类型:只需一段单独的内存,用于存储时间的数据。
引用类型:需要两端内存:
第一段:实际数据,总是位于堆中
第二段:一个引用,指向数据在堆中的存储位置
数据如果不是其他类型的成员就会像下图一样存贮,对于值类型数据放在栈中。对于引用类型数据放在堆中而引用放在栈中
2.存储引用类型对象的成员
引用类型对象的数据始终存储在堆中,如下图。
值类型数据,或引用类型数据的引用可以放在堆里,也可以放在栈里。
例如:引用类型的对象名称为MyType,有两个成员:一个值类型成员和一个引用类型成员,将如何存储呢?
对于一个引用类型,其实例的数据始终放在堆里。既然两个成员都是对象数据的一部分,那么他们都会被放在堆里,无论是值类型还是引用类型 如图:
装箱和拆箱
装箱就是值类型转化为引用类型的过程。将一个值类型变量装箱成一个引用类型变量,首先会在托管堆上为新的引用类型变量分配内存空间,然后将值类型变量拷贝到托管堆上新分配的对象内存中,然后返回新分配的对象内存地址。