C#和Java中对象分为值类型和引用类型,不同类型的对象存储方式不同,如果想要深入了解程序首先要分清楚:哪些是值类型?哪些是引用类?
C#中值类型和引用类型
区别:
1、值类型分配在栈上,它的变量直接存储变量的对象。
2、引用类型分配在栈上,它的变量通常存储一个指向对象的指针,变量通过该指针来引用对象,对象存储在托管堆中。
3、值类型继承自ValueType(注意:System.Value又继承自System.Object);引用类型继承自System.Object。
4、值类型变量存储其实例数据,因此在默认情况下,值类型的参数传递不会影响参数本身;而引用类型变量存储其数据在托管堆中的地址,因此以引用方式进行参数传递会影响到参数本身,因为两个变量引用了内存中的同一块地址。
5、值类型有装箱和拆箱两种表示,运行库提供了所有值类型的已装箱形式;而引用类型只有装箱形式。
6、值类型的内存不由GC控制,作用域结束时值类型会自动释放,减少了托管堆的压力,因此具有性能上的优势。例如:通常struct比class更高效;引用类型的内存回收由GC来完成。
7、值类型是密封的(sealed),不能作为其他任何类型的基类,但是可以单继承或多继承接口;而引用类型一般都有继承性。
8、值类型不具有多态性;而引用类型具有多态性。
9、值类型变量不可为null值,值类型变量都会自动初始化为0值;而引用类型变量默认情况下创建为null值,表示没有存储任何指向托管堆的引用地址。对值为null的引用类型对象做任何操作,都会抛出NullReferenceException异常。
值类型默认值截图:
引用类型默认值截图:
Java中值类型和引用类型
Java中值类型只有八种,没看错只有八种:byte、short、int、long、float、double、char、boolean,其余的全部都是引用类型。