值类型:(原话定义)值类型的变量直接包含值,换言之变量引用的位置就是值在内存中实际存储的位置。
这句话也就是说,值类型的赋值是不会引用同一内存位置的,除了out和ref参数,更改原始变量不影响其它变量的值(因为变量歌有各的位置)
栈
依次向下:
int number1 =42;
char letter ='A';
float pi = 3.14;
int number2 = number1;
总结:值类型的赋值会单独开辟一个新的内存空间,这就引发了另两个问题,第一个是空间占用问题,所以,规范是不要创建内存大于16字节的值类型。第二个问题,由于值类型的值一般只能短时间存在,大多情况下,值类型的值和临时值是存储在称为栈的临时存储区中,然而,临时区清理的代价低于需要进行垃圾回收的堆,但是,值类型会更加频繁地去复值,增加性能开销,这点得注意;
引用类型:它得值是对一个对象的实例的引用,引用类型的变量是引用(通常是内存地址),去那个位置找到对象实例的数据。因此,”运行时“要从变量读取引用,然后根据引用找到资源,从而到达实际包含实例数据的内存位置。即引用类型的变量关联了两个存储位置。
引用类型指向堆,但是引用类型与变量关联的存储位置和值类型并没有区别;若变量短时间存在,就在临时存储区分配它,对于引用类型的变量,它的值要么是null,要么是对需要进行垃圾回收的堆上的一个存储位置的引用。
总结:由于引用类型只复制对数据的引用,因此两个变量客引用相同的数据,这样,赋值和方法调用都将改变相同引用变量的值;