C#堆栈及托管堆的内存创建机制

图片

 

堆栈的地址是从高到低的,托管堆的地址是从低到高的。

 

图片

 

这个部分的创建制止与类的继承本质直接相关,在与创建GC堆内类字段的时候的递归创建以及创建方法表时候的递归创建。

  这里对与类成员方法相关的几个关键字:例如abstract , new , override做简单的描述。

  方法表先于类型句柄产生。产生过程中,与类成员变量继承时的递归空间分配大同小异。在与几个关键字的处理上略有区别。

  对于abstract关键字,在父类中出现,在子类中必须被覆盖,也就是在子类中由override关键字将其覆盖。(过程是递归的,方法表中,父类方法先出现,子类方法出现之时将其覆盖)

  对于override关键字,在子类中出现,无论子类的直接父类使用的是abstract 或override关键字,都将将父类方法覆盖,也就是说,父类方法在方法表中将不再存在,也就无法调用。

  对于new关键字,在子类中出现,那么,其父类的同名方法仍将存在。也就是说,此时方法表中有两个同名方法,一个属于父类,一个属于子类,调用关系看继承大原则。

 

  继承大原则一:对象原则(针对的是类方法的继承)

  从上述几个关键字也可以看出,对于方法来说,除非使用new关键字,否则在一般情况下,父类的方法都会被子类的方法覆盖,将不复存在。那么也就是说,对象是什么,方法表里的方法就是原本属于那个对象的方法。

  继承大原则二:就近原则(针对的是类字段或类方法)

  对于类字段的继承,如果子类中有与父类同名的字段,那么将采用就近原则。就近原则在子类被强制转换成父类的情况下发挥着重要作用。或者在我肤浅的看来,也可以说成是类型就近原则。

 

  引用类型的区别确定了不同对象在方法表中不同的访问权限。

 

  这里给出一个简单的例子:Chicken : Bird : Animal

  Bird bird = new chicken();

  Chicken chicken = new chicken();

  bird.type 为 bird;

  bird.showType() 为 chicken();

  

  耐人寻味,细细体会。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值