public class  Father // 定义 父类
    {
        public Father() // 父类的构造函数
        {

        }
        public virtual int num // 虚属性 注意没有虚字段
        {
            get
            {
                return 0;
            }

        }

        private int pnum = 1;// 私有字段

        protected int bhnum = 2;// 受保护的字段

        public void ShowNum()
        {
            Console.WriteLine("  这个是 父类的");
        }

        public virtual void ShowStr()
        {
            Console.WriteLine("  这个是 父类的");
        }
    }

    public class son:Father // 继承 father
    {
        public son():base() // 构造函数
        {

        }
        private int pnum = 4;// 私有字段

        protected int bhnum = 5;// 受保护的字段

        public override int num
        {
            get
            {
                return 3;
            }

           
        }

        public void ShowNum()
        {
            Console.WriteLine("  这个是 子类的");
        }

        public override void ShowStr()
        {
            Console.WriteLine("  这个是 自类的类的");
        }
    }

Father fatherson=new son();

当程序执行执行到 father fatheson的时候是创建了一个Father类型的引用,new son()的时候是完成创建了一个son 对象,分配内存空间和初始化操作。然后是把这个new son()的对象引用给fatherson.
在初始化new son()有下面几步:
(1):先执行到son类中 检测到有字段,先初始化所有的字段
(2):执行到的son的构造函数的时候检测到有继承先去执行father 类的构造函数,在father 中检测到有字段,初始化所有的字段(father中的)
(3):执行father 中的构造函数
(4):执行son中的构造函数。
在上述4个步骤中,虽然没有提到方法是什么时候初始化的。所有的方法都会在第一次加载的时候创建一个方法表的
在执行 fatherson.num的时候 ,返回值是3. 因为在实例fatherson 中 对father 中的字段 num 重写了。特别注意: 如果father 中num 没有使用virual ,在son 中的num 使用 new 来隐藏father 中的num的情况,那么fatherson.num=0
特别注意 new 和 override的 不同。虽然都是很基础 ,不过自认为是很重要的基础知识点。
在执行 fatherson.shownum();的时候应该输出的是 “”这个是 父类的“” 假如son 类中的shownum方法加了new 关键字 成功的隐藏了fateher中的方法,输出的结果也是一样的。要想执行的是son 类中的方法,必须得向shostr();方法一样的
在执行 fatherson.showstr();的时候要输出的是 “”“这个是 自类的类的”

针对上述代码: 我也是为了写而写的代码,所以在编译的时候会有 警告的。

天道酬勤。 尘世间一个迷途小码畜
posted on 2016-05-24 22:20  My life Of IT  阅读(189)  评论(0编辑  收藏  举报