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);
}
当使用new B()创建B的实例时,产生什么输出?
答:X=1,Y=0;x= 1 y = -1能不能详细的给我讲解下 是怎么走的 再线等 明白就给分
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);
}
当使用new B()创建B的实例时,产生什么输出?
答:X=1,Y=0;x= 1 y = -1能不能详细的给我讲解下 是怎么走的 再线等 明白就给分
先会创建一个A的实例,这样就先创建A的构造,然后调用PrintFields();
而PrintFields() 是一个virtual 方法,被B类重写,然后调用B的PrintFields();
由于y 没初始化,所以先输出1,0
这时开是调用B构造,给y一个-1,然后输出就是1,-1了
class A
{
public static int X;
static A(){
X=B.Y+1;
}
}
class B
{
public static int Y=A.X+1;
static B(){}
static void Main(){
Console.WriteLine("X={0},Y={1}",A.X,B.Y);
}
}
产生的输出结果是什么?
答:x=1,y=2
这个呢~
先寻找A.X 在第一次访问静态成员之前要执行静态构造函数 此时调用A的构造函数 执行到X = B.Y + 1时 由于要访问B.Y 于是执行B的静态构造函数 此时读入A.X 由于X还没有赋值 所以保持默认初始值0 然后B.Y就等于0+1=1 接着返回到X = B.Y + 1这句 X就等于1+1=2 所以输出是2 1
而在X=B.Y+1这句正在执行访问B.Y的时候A.X还是0 所以B.Y变成1 然后执行X=B.Y+1 X变成2