- 突然对比java和c++多态,发现c++多态需要virtual关键字实现,而java中只要是方法复写overwrite就是多态。
class Base{
public void fun(){
System.out.println("derived::fun ");
}
}
class Derived extends Base{
public void fun(){
System.out.println("Derived::fun");
}
}
public class DynanmicTest {
public static void test(Base b){
b.fun();//Derived::fun //默认多态
}
public static void main(String[] args) {
Derived d = new Derived();
test(d);
}
}
- C++多态是借助虚函数表vtable实现,带有virutal关键字的方法就会进入虚函数表vtable。子类虚方法地址填入虚函数表中,覆盖了父类的虚函数地址。在将子类转型父类对象后,调用虚方法时,查找虚函数表(虚函数表已经修改为子类虚方法地址),得到的函数地址是子类虚方法地址,从而实现多态。
- java的多态是通过方法表实现,方法表和c++的vtable原理相同。只不过在java中,子类复写了父类或父接口中方法后,就会将方法表中的函数地址修改为子类函数地址,而不需要任何关键字virtual修饰方法。
- java中调用方法的关键字,其中invokeinterface和invokevitual是实现多态的关键
- invokeinterface 使用itable接口方法表,动态绑定(运行期通过class才可确定);
- invokevitual使用vtable需方法表,动态绑定;
- invokesepical 调用构造器方法或私有方法(private方法默认是final方法),静态绑定(编译器就可确定),静态绑定;
- invokestatic 调用静态方法,静态绑定