日期:2014-05-17  浏览次数:20801 次

一道简单笔试题

    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

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

------解决方案--------------------
答案不是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为什么测试出不同答案,假期闲的蛋疼,上面说的表达的不清楚不要介意
------解决方案--------------------
因为父类 的构造方法 执行了 PrintFields() 子类又 从新写了PrintFields()这个方法   狗仔函数都是在类实例的时候执行 所以你的答案是错的。
------解决方案--------------------
引用:
Quote: 引用:

答案不是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为什么测试出不同答案,假期闲的蛋疼,上面说的表达的不清楚不要介意

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

反正闲测试了

死心了没,LZ还是去看看继承,这个就是个基础来的,期末考试会出的题,没想到是面试题····
------解决方案--------------------
引用:
Quote: 引用:

反正闲测试了