惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
S
Securelist
MyScale Blog
MyScale Blog
Jina AI
Jina AI
罗磊的独立博客
The Cloudflare Blog
美团技术团队
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
雷峰网
雷峰网
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
大猫的无限游戏
大猫的无限游戏
博客园 - Franky
博客园 - 聂微东
Y
Y Combinator Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
T
Tailwind CSS Blog
Attack and Defense Labs
Attack and Defense Labs
博客园_首页
Latest news
Latest news
Apple Machine Learning Research
Apple Machine Learning Research
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Hacker News
The Hacker News
G
GRAHAM CLULEY
Simon Willison's Weblog
Simon Willison's Weblog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Proofpoint News Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
U
Unit 42
D
Docker
Webroot Blog
Webroot Blog
N
Netflix TechBlog - Medium
T
Tor Project blog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The Last Watchdog
The Last Watchdog
B
Blog
Recent Announcements
Recent Announcements
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
Security Latest
Security Latest
V2EX - 技术
V2EX - 技术
N
News | PayPal Newsroom
Microsoft Security Blog
Microsoft Security Blog

博客园 - yinmz

mysql内置函数 mysql表结构随笔 C#的显式接口和隐式接口 设计模式依赖的软件设计原则 UML类图 [导入]《交互设计之路——让高科技产品回归人性》读书笔记(八) [导入]《交互设计之路——让高科技产品回归人性》读书笔记(七) [导入]《交互设计之路——让高科技产品回归人性》读书笔记(五) [导入]《交互设计之路——让高科技产品回归人性》读书笔记(四) [导入]《交互设计之路——让高科技产品回归人性》读书笔记(三) [导入]《交互设计之路——让高科技产品回归人性》读书笔记(二) [导入]《交互设计之路——让高科技产品回归人性》读书笔记(一) [导入]伍迷创意随想集 之 银行排队系统的改良 [导入]伍迷创意随想集 之 爱情博物馆 [导入]伍迷创意随想集 [导入]伍迷创意随想集 之 聚众广告创精品 [导入]一个通过Flash设计与Flex结合开发的网站www.mapgle.cn [导入]岁月凶残,敬请珍惜——得知早已不能过五四节时之随想 [导入]《交互设计之路——让高科技产品回归人性》读书笔记(六) [导入]《交互设计之路——让高科技产品回归人性》读书笔记(九) [导入]《大话设计模式》重印公告 [导入]伍迷随想冷饭集 [导入]伍迷之子满月时之随想 [导入]关于阅读技术类图书的思考 [导入]《大话设计模式》第三次印刷公告
读 你必须知道的.NET有感
yinmz · 2009-07-10 · via 博客园 - yinmz

      最近正在 看你必须知道的.NET这本书,下面是在看书过程中,记载的自己的一些感受和书中没有看到的,记下来供自己以后翻看:

07-10

      page23 1.2章节 继承

      ok,首先我们需要有对象定义,也就是class定义,根据书中的例子我们写出下面3个类的代码

      public abstract class Animal
      {
              public abstract void ShowType();
              public void Eat()
              {
                  Console.WriteLine("Animal always eat!");
              }
      }          

      public class Bird:Animal  
    {
        private string color;
        public string Color
        {
            get { return color; }
            set { color = value; }
        }
        private string type = "Bird";
        public string Type
        {
            get { return type; }
        }
        public override void ShowType()
        {
            Console.WriteLine("Type is {0}", type);
        }
    }

public class Chicken:Bird
    {
        private string type = "Chicken";

        public new string Type
        {
            get { return type; }
        }
 
        public override void ShowType()
        {
            Console.WriteLine("Type is {0}", type);
        }

        public void ShowColor()
        {
            Console.WriteLine("Color is {0}", Color);
        }
    }

      当我们只是声明一个对象变量的时候:Bird bird ;仅仅是一个引用(指针),保存在线程的堆栈上,占用4Byte的内存空间,将用于保存Bird对象的有效地址,此时bird未指向任何有效的实例。

      创建新对象 bird=new Bird();要说的主要在这里,通过F11进入Bird类内部会发现,程序对类内部的字段初始化,然后执行构造函数,这里private string color;只是声明变量没有赋值 ,设置断点不会执行到该语句,如果private string color = string.Empty;就会执行到这里

然后是书中重点提到的内容:

声明并创建两个对象:Bird bird2 = new Chicken();
            Chicken chicken = new Chicken();

这时候bird2的字段或者属性读取的是Bird类的值,而方法是执行的Chicken的方法

书中的解释是:bird2对象和chicken对象在内存布局上是一样的,差别在于其引用指针的类型不同:brid2为Bird类型指针,而chicken为Chicken类型指针。以方法调用为例,不同的类型指针在虚拟方法表中有不同的附加信息作为标志来区别其访问的地址区域,称为offset。不用类型的指针只能在其特定的地址区域内执行,子类覆盖父类时会保证其访问地址区域的一致性,从而解决了不同的类型访问具有不同的访问权限问题。

执行就近原则:对于同名字段或者方法,编译器是按照其顺序查找来引用的,首先访问离他最近的字段或者方法,如上Type,这也就是为什么在对象创建时必须将字段按顺序排列,而父类要先于子类编译的原因了。