这段代码的输出结果是什么呢?why?
public abstract class A  {         public A()         {             Console.WriteLine('A');         }         public virtual void Fun()         {             Console.WriteLine("A.Fun()");         } } public class B: A  {         public B()        {             Console.WriteLine('B');         }         public new void Fun()         {             Console.WriteLine("B.Fun()");         }         public static void Main()         {            A a = new B();            a.Fun();         } } 

解决方案 »

  1.   

    如果在B类中的fun方法不是用new是override。
    则结果是:
    A
    B
    B.fun
      

  2.   


    A.fun()
    B.fun()构造无法承继
    基类函数先执行,再执行子类函数
      

  3.   

    楼上不要误导……
    结果就是
    A
    B
    A.Fun()
      

  4.   

    应用程序启动,操作系统为程序分配内存,在loader堆中先加载A类型的静态成员,常量和方法表
    再加载B类型,不过因为B:A所以要先加载A类型loader中的数据地址,然后加载自己独有的数据。
    加载会出现两个fun方法,因为B中采用了new关键字,所以会有两个,如果是override则覆盖掉A的fun方法
    也就是说只有一个。
    A a =new B()根据loader heap分配Gc heap中的内存。并将B中的方法表的地址存放在GC heap中。并创建两个指针,一个this指针,一个base指针调用B()构造函数,先调用base指针调用A()构造函数,A构造函数完成再调用this指针调用B()构造函数,这时候输出 A B 然后a.fun(),在方法表中找到B的方法表的地址发现两个fun方法,因为a声明的是A类型,根据同名方法调用的类型就近原则所以调用A的fun方法输出:A.fun