java方法重写与重载
从jvm层面来说,重载是一种静态指派方式,那么它在编译期就已经确定了,比如一个类中相同的方法名称根据不同的参数类型和参数个数进行重载;
而重写是一种动态链接行为,是需要java在运行期才能知道,需要指向的是哪个子类的哪个方法去执行。
编译期能够静态指派方法有:1 构造方法,2 父类方法,3 静态方法,4 私有方法
调用父类构造方法时使用invokeSpecial指令,调用重写或重载方法使用invokevirtual,调用静态方法使用invokeStatic
父类:A ,子类:A1和A2
A a1=new A1();
A a2=new A2();
a1.test();
a2.test();
方法重载是一个静态指派的过程,直接根据参数类型不同在编译期即可确定调用关系,而方法重写通过invokevirtual调用的时候,实际是先从当前线程的操作数栈顶取出当前的对象,然后根据invokevirtual中标记的父类方法描述符进行匹配,如果完全匹配,就调用实际栈顶对象的目标方法;该过程称为java运行期的动态链接,是满足多态的一种实现。