多态底层原理【附原理模型图】
多态底层原理
多态的底层原理是方法后期的动态绑定,由于Java是由C和C++实现的,所以多态的原理和C++是类似的,一个类会对应一个虚函数表,而且Java中的所有非静态的方法、非final修饰的方法、非private方法都是虚函数。假设我们有一个Supper
类,定义如下
public class Supper {public void a(){System.out.println("方法A");}// 私有方法不放在虚函数表里private void b(){System.out.println("方法b");}
}
上述类的方法模型图如下:
假设我们有一个Son类,定义如下
public class Son extends Supper{
}
当子类继承父类时,父类的虚函数表里有的虚函数指针,子类也会有,当方法没有被重写时,子类的虚函数表中继承于父类的虚函数的指针指向父类的方法代码实现,Son
类的方法模型图如下:
现在我们对Son
类进行修改,使其重写父类的a方法
public class Son extends Supper{@Overridepublic void a(){System.out.println("重写a");}
}
当子类重写父类的方法之后,会改写虚函数表中的虚函数指针的地址,使其指向子类重写的方法的代码。如下图所示
此时,我们通过如下代码进行调用
public static void main(String[] args) {Supper instance = new Son();instance.a(); // 输出:重写a}
分析上述代码,创建一个Son
对象instance
,当调用a()
方法时,JVM会查找instance
对象的虚函数表,因为Son
类重写了a()
方法,所以调用的是重写后的a()
方法。
总结:当通过父类的引用调用一个方法时,JVM会查找该对象的虚函数表,找到对应方法的虚函数指针并调用,此时查找的是子类的虚函数表,所以调用的方法子类也是重写后的方法,所以就实现了使用父类的引用调用子类的方法,这便是多态的底层原理。