小弟刚接触C#有段时间,有段代码看不明白,有劳各位大侠指点迷经 class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields() { }
}
class B : A
{
int x = 1;
int y;
public B()
{
y = -1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}", x, y);
}
} class Program
{
static void Main(string[] args)
{
B TB = new B();
} }-----------------
输入结果为 x=1,y=0
-----------
我有两点不明白
1.我没有调用PrintFields () 为什么它会有输出呢!?2.为什么 y不是-1 呢?
在调用B的构造函数时 先调用A的构造函数 所以调用了 PrintFields又由于 在A类里 没有对y 进行初始化 所以y=0
再调用构造函数(因为B继承于A, 所以A的构造函数,再B的构造函数)
然后将y=-1
public B():A()
也就是说在进入B的构造器前要先进A所以打印x=1,y=0(因为y默认是0)
在进行完以上操作后
再吧y赋值为-1
如果再加句
B TB = new B();
TB.PrintFields();
打印结果就是1,-1
未初始化是编译错误调用null的方法或者使用其成员会导致未将对象引用设置到对象实例的异常。
可以大多数人对实例化过程有点误解,认为执行实例化函数才是开始实例化一个类,其实这应该是错误的.完整的实例化过程应该是:实例化子类字段>>实例化基类字段>>执行基类实例化函数>>执行子类实例化函数>>完成实例化。通过逐语句跟踪的方式可以清楚的查看类实例化的过程。