热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

高手帮详细解答下面试题

usingSystem;classA{publicA(){PrintFields();}publicvirtualvoidPrintFields(){}}
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

16 个解决方案

#1


汗。。自己看书去。。
这分明是书上的题目。。。

#2


x=1,y=-1
当类A在哪里起什么作用呢?
根本就没关系嘛

#3


该回复于2008-07-30 09:36:00被版主删除

#4


That is a bad exam question.

1. It is bad to call virtual function in the constructor, because the derived class could be not yet fully initialized.
2. Because the derived class is not yet fully initialzed ( y = -1 is not yet assigned ), calling the virtual function 
   gives you the 'wrong' answer.

#5


 你写个主函数调试一下
x=1,y=0 是因为 New B是 先要用A的构造函数
 所以就出现了上面的
x=1,y=-1是因为 用了B的构造函数

看看构造函数就知道了


 

#6



class A
{
   public A()
   {
      SaySomething();                  // new A() has no problem, but new B() will throw null reference exception. Bad!
   }
   public virtual void SaySomething()
   {
   }
}

class B
{
   Random rand;
   public B()
   {
      rand = new Random();
   }

   public virtual void SaySomething()
   {
      Console.WriteLine( "hi " + rand.Next() );
   }
}

#7


Correction to my previous post:

...

class B  : A
{
...

#8


new B!

#9


是类初始化顺序你没有高明白了
先是基类的构造函数,然后是继承类的构造函数
这里先是a的构造函数,调用PrintFields();,但是a的PrintFields();是虚拟的,什么都没有做,然后调用他的实现方法,就是b 的PrintFields();,显示x,y,这时候x是初始化为1,y没有初始化,默认0,所以显示x=1,y=0。
然后构造b,调用b的构造函数,把y初始化为-1.然后是 obj.PrintFields();这句,调用了b的PrintFields()方法,显示x和y,这是后x没有变,y在b的构造函数中赋值-1
所以显示的时候就是x=1,y=-1
执行结果是 X=1,Y=0;x= 1 y = -1 

#10


x=1,y=0


调用顺序
基类(A)构造函数 -> A PrintFields() (由于被Boverride,所以实际是调用B的PrintFields()) -> B构造函数

#11


这段代码的执行顺序如下?
using System; 
class A 

public A() 

PrintFields(); // 2

public virtual void PrintFields(){} 

class B:A 

int x=1; 
int y; 
public B() 

y=-1; /// 1.

public override void PrintFields() 

Console.WriteLine("x={0},y={1}",x,y); // 3.

首先是类B中的变量声明,X = 1,y是随机的,可能是0,也可能是别的,由编译器的不同而不同,
再次是执行B的构造函数,进而在执行A的构造函数,
在执行PrintFields函数,此时由于PrintFields是虚函数,而此时B中正好重载了这个函数,因此执行B找中的PrintFields函数。输出时X = 1,y由于没有初始化,此时不知道是什么值,因该是随机值,视编译器而定!!!C#的编译器应该会初始化为0.

#12


真乱,为什么面试题总是这么的糟糕?

#13


答案是 x=1,y=0,我说怎么也得不出LZ说的结果嘛,下面是我用的实验代码:

using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            B x = new B();
            int c = 20;
        }
    }

    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);
        }
    }
}


为何得到的是x=1,y=0,是因为在new B()的时候,首先要调用A的构造函数,然后再调用B自身的构造函数,当调用A的构造函数的时候,要执行PrintFields()方法,而PrintFields()方法是一个虚函数,而此时是在创建类B的实例,因此会调用类B中的PrintFields(),此时x=1,而y尚未赋值,默认值是0,因此在屏幕上打出 x=1,y=0 ,执行完成后,再调用类B的构造函数,只是给y赋了个值,执行结束.

#14


x= 1 y = -1 
主要是考你的理论基础和思路。

#15


y=-1没有用吗 ?

#16


x=1, y=0

y=-1是在调用base的构造函数之后运行的,之后就不会再调用PrintFields()方法了,所以LZ的答案不对。。。

推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
author-avatar
苏格拉没有底YI_670
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有