这段代码的输出结果是什么呢?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(); } }
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(); } }
则结果是:
A
B
B.fun
A.fun()
B.fun()构造无法承继
基类函数先执行,再执行子类函数
结果就是
A
B
A.Fun()
再加载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