看如下代码:
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类的构造函数
换个说法:要实例化子类时、先要实例化父类、然后从父类的基础上修改成子类、这就能解释为什么调用子类的构造方法前会调用父类的构造方法