using System;
using System.Collections.Generic;
using System.Text; namespace ConsoleApplication4
{
using System;
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 Test
{
static void Main()
{
B b = new B();
}
}} 为什么最后的输出会是 X=1 Y=0 ,y为什么会是0
using System.Collections.Generic;
using System.Text; namespace ConsoleApplication4
{
using System;
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 Test
{
static void Main()
{
B b = new B();
}
}} 为什么最后的输出会是 X=1 Y=0 ,y为什么会是0
当B b = new B()时, 先调用父类A的构造函数,调用PrintFields(),由于PrintFields是virtual的,并在B中override,所以就调用B自己的PrintFields. 打印出x=0,y=1
public B()
{
y = -1;
}
这句代码不执行了,是吧 如果父类有明确的构造函数,那么子类的构造函数就不执行了,是吧
1、b继承a。因此在构造函数B()中先调用构造函数A()。
2、构造函数A()中执行PrintFields()方法。这时候 x = 1;y未定义。但是C#在创建实例时,自动默认未初始化的字段(值类型为0,引用类型为null),则y为0,并输出到控制台。
3、然后才执行y = -1;
你可以断点,然后按f11,一步步看是怎么执行的。