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 )

  • 相关阅读:
    Django基础
    Web框架
    JQuery
    16 Javascript
    axios+qs传值序列化时出现数组形式我们该如何修改呢?
    MyBatis 对象中含有对象的查询
    MyBatis 新增获取自增主键的小坑
    List、Set、Map
    事务的隔离级别
    mybatis配置中文参考文档
  • 原文地址:https://www.cnblogs.com/abcjun/p/4673681.html
Copyright © 2011-2022 走看看