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 = -11.面试回来后我在自己机器试了下,输出的是x=1,y=0。他们给的答案竟然不对?!
2.为什么实例化类B会执行方法PrintFields();
3.为什么 y = 0 ?
面试

解决方案 »

  1.   

    答案不是x = 1, y = 0 ; x = 1 y = -1?应该没问题是这个答案吧,你这个y在A中都没赋值它默认就给个0了吧,你下面的y=-1那是你在实例B时给它赋值了y=-1,这道题就是个继承和重写题,B继承了A,A中有虚拟方法,你在B中重写,继承A,就会输出A中的方法,A中没x也没定义,但是你的B中声明了,就可以用了,就会先输出父类的结果就是x=1,y=0;接着就是输出B的结果x=1,y=-1,应该是这结果,但是我不知道LZ为什么测试出不同答案,假期闲的蛋疼,上面说的表达的不清楚不要介意
      

  2.   

    “A中有虚拟方法,你在B中重写,继承A,就会输出A中的方法”,你是说被重写的虚拟方法调用后会同时先执行父类的方法再执行子类的方法?
    我测试了确实是只输出x=1,y=0。(注意A中的虚拟方法根本没有实现什么)你可以花几秒钟复制到控制台测试下嘛
      

  3.   

    因为父类 的构造方法 执行了 PrintFields() 子类又 从新写了PrintFields()这个方法   狗仔函数都是在类实例的时候执行 所以你的答案是错的。
      

  4.   

    “A中有虚拟方法,你在B中重写,继承A,就会输出A中的方法”,你是说被重写的虚拟方法调用后会同时先执行父类的方法再执行子类的方法?
    我测试了确实是只输出x=1,y=0。(注意A中的虚拟方法根本没有实现什么)你可以花几秒钟复制到控制台测试下嘛
    反正闲测试了死心了没,LZ还是去看看继承,这个就是个基础来的,期末考试会出的题,没想到是面试题····
      

  5.   


    我用的是vs2008,你的呢?
    道理上确实应该先执行A的构造函数,而且调用的是B的重写方法,应该输出像你说的那样,但我的机器怎么就是这样??
      

  6.   


    我用的是vs2008,你的呢?
    道理上确实应该先执行A的构造函数,而且调用的是B的重写方法,应该输出像你说的那样,但我的机器怎么就是这样??
    不关是VS08或者10的问题的,我的也是10的,是你代码问题吧,反正我是复制你的代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {            B b1 = new B();
                b1.PrintFields();
                Console.ReadLine();
            }
        }
        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);
            }
        }
    }
      

  7.   


    我用的是vs2008,你的呢?
    道理上确实应该先执行A的构造函数,而且调用的是B的重写方法,应该输出像你说的那样,但我的机器怎么就是这样??
    不关是VS08或者10的问题的,我的也是10的,是你代码问题吧,反正我是复制你的代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {            B b1 = new B();
                b1.PrintFields();
                Console.ReadLine();
            }
        }
        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);
            }
        }
    }

    还有就是不要再纠结在这了,反正都面试不过了,还是想想下次面试吧
      

  8.   


    我用的是vs2008,你的呢?
    道理上确实应该先执行A的构造函数,而且调用的是B的重写方法,应该输出像你说的那样,但我的机器怎么就是这样??
    不关是VS08或者10的问题的,我的也是10的,是你代码问题吧,反正我是复制你的代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {            B b1 = new B();
                b1.PrintFields();
                Console.ReadLine();
            }
        }
        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);
            }
        }
    }

    还有就是不要再纠结在这了,反正都面试不过了,还是想想下次面试吧楼主只是说B b = new B();
    并没有b.PrintFields();所以你们结果不一样,去掉后面一行,你们就一致了。
      

  9.   


    你加了行b1.PrintFields(),结果肯定那样啦。
    我就写了个new B(),什么也没有    class Program
        {
            static void Main(string[] args)
            {
                new B();
                Console.ReadKey();
            }
        }
      

  10.   


    你加了行b1.PrintFields(),结果肯定那样啦。
    我就写了个new B(),什么也没有    class Program
        {
            static void Main(string[] args)
            {
                new B();
                Console.ReadKey();
            }
        }
    你不加这个那你怎么输出B的重写的结果,那你B继承A来做什么还不如直接输出A得了,省功夫