方法继承的真相---虚方法表

  • 虚方法表
  • 方法重写的本质

我们关注一个类往往会把注意点放在它的成员变量上,而对于他的成员方法往往关注的比较少。在类的继承中我们知道成员方法往往都会被继承,但是对于成员方法往往会有许多疑惑

  • 之前观点:
    以前方法调用特点:当该类的对象调用一个方法,会先在本类中寻找该方法,如果本类中没有找到,会到父类中寻找,如果父类中没有找到,将会到父类的父类中寻找该方法,以此反复

现在看来我当时的思想还是有矛盾的。如果方法可以被继承,在子类中应该是将父类的方法都继承了下来,为什么需要一级一级的向上去寻找呢?如果都没有被继承,如果用到父类的方法不总是要向上去寻找吗?这样会不会影响效率?

  • 当我们类的继承结构如下图时:

    这时我们需要调用的一个方法在顶级父类p类中,我们需要从A类开始一级一级的向上去寻找,这样效率应该会很低,我们的java设计者也想到了这一点,于是设计出了虚方法表进行优化

虚方法表优化

虚方法表
指的是由1.非private 2.非static 3.非final修饰的方法组成的常用方法的列表

在一段继承结构中:会从顶级父类开始把自己常用的方法抽取出来放到自己的虚方法表中,并在里面加上自己的常用方法,并将虚方法表交给自己的子类,以此反复

在虚方法的添加结束后,每一个类都有自己的虚方法表,其中包含自己和自己所有父类的常用方法

在方法调用的时候,会优先在自己的虚方法表中寻找,如果没有向上寻找,以此提高效率

方法继承的本质

在将常用方法添加到虚方法表中并交给子类,其实这个过程就是方法的继承,实际添加到虚方法表中的方法被继承到了子类中,可以得出结论:只有虚方法才能被继承
举例说明:


以上的继承结构实际是:Zi-->Fu-->Object
我们的Object类中只有5个虚方法,添加到虚方法表中并交给Fu,Fu中有一个虚方法,添加到虚方法表中并交给Zi,

方法重写的本质


方法重写的本质就是父类该方法在子类虚方法表中的内容

我们的B类如果要调用method1这个方法会先在虚方法表中进行寻找,调用的是C类中的mehtod1方法,当我们在B类中进行重写C类的method1方法,实际上是重写在虚方法表中的method1,再次调用的时候就是调用新重写的method1

posted @ 2023-02-25 22:38  一往而深,  阅读(502)  评论(0编辑  收藏  举报