//运行结果x=1,y=0
class A
{
public A()
{
PrintFields(); }
//virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。例如,此方法可被任何继承它的类重写。
public virtual void PrintFields() { }
}
class B : A
{
int x = 1;
int y;
public B() { y = -1; }
//要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}", x,y);
}
public static void Main()
{
Console.Write(new B());
}
}为什么public B() { y = -1; } 没有被执行???
class A
{
public A()
{
PrintFields(); }
//virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。例如,此方法可被任何继承它的类重写。
public virtual void PrintFields() { }
}
class B : A
{
int x = 1;
int y;
public B() { y = -1; }
//要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}", x,y);
}
public static void Main()
{
Console.Write(new B());
}
}为什么public B() { y = -1; } 没有被执行???
public static void Main()
{
new B();
}
子类的变量:int x = 1;
子类的构造函数:B(),这里会去先执行基类的构造函数也就是A(){...}然后再执行自己的函数体{y=-1}
Console.Write(new B().y);
y已经变成-1了,关键在于父类的构造函数先于子类执行
不是给你说得非常清楚了吗:父类的构造函数先于子类执行
也就是:
A()
PrintFields()
B()执行PrintFields的时候,B的构造函数还没执行呢,所以是0,而最终Console.Write(new B().y),这里就是-1了楼主应该是来自阿富汗吧,建议先学习中文,明白什么叫父类的构造函数先于子类执行
先执行父类构造方法,再执行子类构造方法
你的方法刚执行到父类构造方法就把x,y输出了:Console.WriteLine("x={0},y={1}", x,y);
输出完后才执行你子类的 y = -1;语句