父类、子类构造的理解

看如下代码:

 class B
    {
        public int i = 0;
        public String str = "B.str";
        public void fun()
        {
            Console.WriteLine("B.fun()");
        }
        public B()
        {
            Console.WriteLine("B");
        }
    }

    class C : B
    {
        new public int i = 1;
        new public String str = "C.str";
        new public void fun()
        {
            Console.WriteLine("C.fun()");
        }
        public C()
        {
            i = 2;
            //base.i = 2;           注意
            Console.WriteLine("C");
        }
    }

    class A
    {
        static void Main()
        {
            B b = null;
            b = new C();
            Console.WriteLine("i = " + b.i + " str = " + b.str);
            b.fun();
        }
    }

运行结果:

B
C
i = 0 str = B.str
B.fun()

把“注意”处的注释去掉

运行结果:

B
C
i = 2 str = B.str
B.fun()

为什么i = 2不能使 i 的值改变而要使用base.i才能改变的?

因为即使对象b是使用子类C构造的、但是遵循以下原则:

使用子类的构造函数构造对象前、首先须调用父类的构造方法、因为子类的构造方法是从父类派生下来的、而字段和属性则不需要(这句话很重要)

所以解释以上问题、 为什么要使用base.i才能修改值、是因为调用C类的构造方法构造B类的对象时、仅仅是使用了用于构造对象C类对象的模板B类的构造函数

换个说法:要实例化子类时、先要实例化父类、然后从父类的基础上修改成子类、这就能解释为什么调用子类的构造方法前会调用父类的构造方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值