A a= new B();

A a= new B(); 定义一个A类型的引用,指向新建的B类型的对象

问:B继承A,a是A的实例还是B的实例?

答:B的实例

 

问:对象a可以调用A类中的方法吗?可以调用B的方法吗?

答:不一定,如果是虚拟方法,并且在B类重载了A的虚拟方法,a将会调用B的同名方法,普通方法会调用A的方法, 

举例:
class A
{
public void MethodA(){...}
public virtual void MethodB(){...}
}

class A:B
{
public new void MethodA(){...}
public override void MethodB(){...}
}

其中,B类重写了A类的普通方法MethodA,也重写了A类的虚拟方法MethodB,则:
A a = new B();
a.MethodA();// 将会调用A类的MethodA方法
a.MethodB();// 将会调用B类的MethodB方法

(问:既然a是B的实例为什么调用a.MethodA() 会调用A类的方法?

   答:a有两个类型:一个是“编译时类型(声明类型)”,一个是“运行时类型(实际类型)”,a的编译时类型是A,a的运行时类型是B,非虚方法在编译时就要邦定,编译时a的运行时类型并没有确定,所以非虚方法会邦定到MethodA上(即执行MethodA),虚方法在运行时邦定,运行时a的实际类型是B,所以虚方法会执行MethodB )

原文地址:https://www.cnblogs.com/abcjun/p/4673681.html