A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hongiqnglik 中级黑马   /  2013-8-5 21:22  /  1107 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

既然 int是值类型,而 class是引用类型,那么int是怎样从Object派生的呢?

3 个回复

倒序浏览
值类型并不是直接继承自object类的,而是继承自ValueType类,凡是继承自ValueType类的类型都会定义为值类型。
回复 使用道具 举报
1值类型与引用类型都有相应的类型对象,.net中的所有的类型对象(除type外) 的类型对象指针指向Type的实例type(CLR加载时候初始化),而type有个basetype属性指向Object的类型对象,另类型对象和类型对象的继承关系通过BaseType来引用,这样整个类型对象的就全部链接起来了,最底层的对象就是object的类型对象。
2而创建一个实例的时候 若果为值类型一般请况下在栈上包含值,而它如何调用方法呢?这是因为CLR总是隐士知道其类型对象,使得值类型可以像对象一样调用方法。若为引用类型,其包含一个类型指针指向其类型对象的方法表。

鉴于1、2所述,就清楚object是顶级基类这句话的含义了。也解释了结构类型从ValueType继承。,而valueType继承自Object.
回复 使用道具 举报

是这样的,当int用作int时候,这是一个值类型(在栈上),然而,当它用作是Object时,这是一个引用堆上的整数值的引用类型。换而言之,当你将int看作对象时,运行层将它自动转化为对象引用,这个转化过程称作装箱(boxing)。这个转换包括将栈里的值拷贝到了堆里,并且新建了一个对象的实例来引用该值。拆箱操作(unboxing)是个反过程——将对象转化为基于栈的值类型。

int x = 3;
// 堆栈上新的int类型,值为3
object objx = x;
// 堆上新的int, 设定值为3,x=3仍然在堆栈上
int y = (int)objx;
//新的int类型的值3在堆栈上,x=3在堆栈上,objx=3在堆上



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马