继承的本质的个人学习笔记

对继承的本质的一些理解,看了些文章和博客,总结成自己的文字加深一下理解,可能表达和理解的不是很透彻,请带着批判的眼光阅读~
先附上大神们的文章~

http://www.cnblogs.com/pbwf/archive/2008/03/27/1125451.html


new创建对象时,递归查找父类,分配内存,最先创建的应该是object。
对象是在运行时创建的,方法是在编译时创建,对象字段和方法的创建和调用遵循执行就近原则,因此子类会拷贝父类的方法和字段,父类的字段和方法在前,子类的新添加的方法和字段在后,调用按字段和方法存储的顺序调用,如果子类重写父类的方法,就会覆盖从父类拷贝的方法,如果用new定义同名方法,就会隐藏父类方法的实现,父类的方法还存在,排在子类同名方法前
调用的方法是子类还是父类的,和引用类型无关,只和创建的对象是子类还是父类对象有关(关注对象原则),同时声明引用类型的不同只会决定对方法的访问权限的不同,父类可以声明创建子类对象,是因为子类会继承拷贝父类的方法和字段,在子类中父类型的引用具有访问权限。而子类不可声明和创建父类对象是因为,父类中子类指针是不具有访问权限的。
父类型的引用只能调用子类中从父类拷贝的方法和字段,对子类新添加的方法和字段是无法调用的。子类型的引用调用的优先级按父类在前,子类的在后原则,如果子类使用new定义了同名方法,那么就会隐藏父类的方法,优先调用子类的方法


简单的助于理解的代码:
 public class Bird
    {
        private string type = "bird";
        public virtual string ShowType()
        {
            return "bird";
        }
    }

    public class Chicken : Bird
    {
        private new string type = "chicken";
        public string show()
        {
            return "chicken";
        }
        public override  string ShowType()
        {
            return "chicken";
        }
    }
调用代码如下:
            Bird bird = new Chicken();
            Chicken chicken = new Chicken();
            string str1 = bird.ShowType();
            string str2 = chicken.ShowType();
结果:str1-chicken str2-chicken

改一下子类的方法
 public class Chicken : Bird
    {
        private new string type = "chicken";
        public string show()
        {
            return "chicken";
        }
        public new string ShowType()
        {
            return "chicken";
        }
    }
结果:str1-bird str2-chicken 
虽然创建的都是chicken对象,但是bird是无法调用chicken中的show()方法的,chicken是可以的,这就是引用类型的访问权限的不同。

转载于:https://www.cnblogs.com/rookiego/p/5354450.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值