首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

看不明白为什么会输出这个结果!解决方案

2012-03-01 
看不明白为什么会输出这个结果!? 小弟刚接触C#有段时间,有段代码看不明白,有劳各位大侠指点迷经classA{pub

看不明白为什么会输出这个结果!?

小弟刚接触C#有段时间,有段代码看不明白,有劳各位大侠指点迷经

        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   Program
        {
                static   void   Main(string[]   args)
                {
                        B   TB   =   new   B();
                }

        }

-----------------
输入结果为   x=1,y=0
-----------
我有两点不明白
1.我没有调用PrintFields   ()   为什么它会有输出呢!?

2.为什么   y不是-1   呢?

[解决办法]
实际上B调用了A的构造函数,执行PrintFields(),这时由于没有执行B的构造函数,所以y=0,输出的是x=1,y=0,但调用A的构造函数结束后,就会调用B的构造函数,这时y=-1,也就是说程序结束时,x=1,y=-1
[解决办法]
是这样的,先调用基类的构造方法再调用子类的构造方法
[解决办法]
你自己分析的有道理。是先调用了A的构造函数
[解决办法]
没错的,程序先是调用A的构造函数,此时由于x在B类中是一个字段, 已经付值为1,所以x=1,但此时输出时,由于y还没有付值给它,所以它的值为0即y=0
[解决办法]
当类B在Main方法中实例化的时候,由于B继承A,先调用A的构造函数, 运行到PrintFields();的时候,由于B重载了此方法public override void PrintFields(),所以运行B的方法,输出x=1,y=0
[解决办法]
B继承了A 调用B的构造函数的时候会先执行A的构造函数,A的构造函数调用了PrintFields

A public virtual void PrintFields() { } 是个虚函数 ,所以会先输出 x=1 y=0
然后将y=-1

[解决办法]
继承时B的构造函数相当于
public B():A()
也就是说在进入B的构造器前要先进A所以打印x=1,y=0(因为y默认是0)
在进行完以上操作后
再吧y赋值为-1
如果再加句
B TB = new B();
TB.PrintFields();
打印结果就是1,-1
------解决方案--------------------


B继承了A,调用B的构造函数的时候会先执行A的构造函数!很清楚的。
[解决办法]
实例化过程是先实例化过程是首先实例化B的字段x,y,然后在执行B的实例化函数之前,因为从A类继承,所以要实例化基类A,再执行B的实例化函数;A类的实例化函数调了虚方法,这个方法由B类实现,所以实际被调用的函数是B类中的方法,在执行该方法时,B类的实例化函数尚未执行,x,y的值为原始值,所以最终结果为x=1,y=0
可以大多数人对实例化过程有点误解,认为执行实例化函数才是开始实例化一个类,其实这应该是错误的.完整的实例化过程应该是:实例化子类字段> > 实例化基类字段> > 执行基类实例化函数> > 执行子类实例化函数> > 完成实例化。通过逐语句跟踪的方式可以清楚的查看类实例化的过程。

热点排行