zoukankan      html  css  js  c++  java
  • 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 )

  • 相关阅读:
    索引初识
    python数据类型之 元祖、列表字典
    linux常用命令之网络命令
    linux命令之查找find &grep
    python数据类型之可hash,不可hash
    python面向对象之封装,多态与继承
    python之新式类与经典类
    python之random随机函数
    CSS3选择器(一)
    关于居中
  • 原文地址:https://www.cnblogs.com/abcjun/p/4673681.html
Copyright © 2011-2022 走看看