namespace ConsoleApplication1
{
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields() { Console.WriteLine("this is class B method"); }
}
class B : A
{
int x = 1;
int y;
public B():base()
{
y = -1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}", x, y);
}
}
public class C
{
public static void Main()
{
B b = new B();
Console.Read();
}
}
}
我把你的程序补充完整,如上代码,当new B()输出的为X= 1 ,Y = 0;
分析:
1、在new B()是会先调父类即A的构造函数,这时会执行PrintFields();方法,因为PrintFields方法为虚拟方法,在子类中重写的该方法,所在实际执行的为B中的PrintFields方法。
2、为什么Y=0?这是因在调用的是父类方法,子类的中的Y还没初始会,系统自己赋值为0。
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields() { Console.WriteLine("this is class B method"); }
}
class B : A
{
int x = 1;
public int y;
public B():base()
{
y = -1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}", x, y);
}
}
public class C
{
public static void Main()
{
B b = new B();
Console.WriteLine("Y={0}",b.y);
Console.Read();
}
}
结果为:X=1,Y = 0
Y = -1
{
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields() { Console.WriteLine("this is class B method"); }
}
class B : A
{
int x = 1;
int y;
public B():base()
{
y = -1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}", x, y);
}
}
public class C
{
public static void Main()
{
B b = new B();
Console.Read();
}
}
}
我把你的程序补充完整,如上代码,当new B()输出的为X= 1 ,Y = 0;
分析:
1、在new B()是会先调父类即A的构造函数,这时会执行PrintFields();方法,因为PrintFields方法为虚拟方法,在子类中重写的该方法,所在实际执行的为B中的PrintFields方法。
2、为什么Y=0?这是因在调用的是父类方法,子类的中的Y还没初始会,系统自己赋值为0。
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields() { Console.WriteLine("this is class B method"); }
}
class B : A
{
int x = 1;
public int y;
public B():base()
{
y = -1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}", x, y);
}
}
public class C
{
public static void Main()
{
B b = new B();
Console.WriteLine("Y={0}",b.y);
Console.Read();
}
}
结果为:X=1,Y = 0
Y = -1