虚拟方法的重写和静态方法的调用

本文探讨了C#中虚拟方法的重写及静态方法的调用机制。通过两个具体例子,详细解释了子类构造函数如何调用被重写的父类虚方法,以及静态方法在不同类间的相互引用与初始化顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虚拟方法的重写和静态方法的调用
1、     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);
            Console.ReadLine();
        }

        static void Main(string[] args)
        {
            B b = new B();  // x=1  y=0
            b.PrintFields();  //x=1  y=-1
        }
当使用new B()创建B的实例时,产生什么输出?
答:X=1,Y=0
当使用new B()创建b的实例时,b.PrintFields()产生什么输出?
x=1,y=-1
2.下面的例子中
     using System;
     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

1.运行子类的构造函数时会先实行父类的构造函数,父类构造函数调用被子类覆盖的虚函数

2.而实际上,第二题是首先加载B类的代码到内存中,因为Main在B类里面。依照顺序执行的时候,发现了A.X,这时候A尚未出现,于是去找A。A加载到内存。此时X为0.B已存在,Y未赋值,自然为0.A静态部分构造完成后,X为1.回到B,此时Y = 1 + 1,也就是2.于是得到输出,X = 1,Y = 2。

如果需要证明,可以执行本人修改的代码如下:
 
 
class A
    {
        public static int X;
        static A()
        {
            Console.WriteLine("in A static,X is " + X.ToString());  //x=0
            X = B.Y + 1;
            Console.WriteLine("in A static again,X is " + X.ToString());//x=1
        }
    }
    class B
    {
        public static int Y = A.X + 1;
        static B()
        {
            Console.WriteLine("in B static,Y is " + Y.ToString());//x=2
        }
        static void Main()
        {
            Console.WriteLine("X={0},Y={1}", A.X, B.Y);
            Console.ReadLine();
        }
    }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值