重载与重写
    重载,我们想要在同一个类中定义名字相同的方法,那么它们的参数类型必须不同。重载的方法在编译过程中即可完成识别。编译器会根据传入参数的声明类型选取重载方法。
    1、不考虑对基本类型自动拆装箱以及可变长参数的情况下选取重载方法;
    2、如果在1中没有找到适配的方法,那么在允许自动拆装箱但不允许可变长参数的情况下选取重载方法;
    3、如果在2中没有找到适配的方法,那么在允许自动拆装箱以及可变长参数的情况下选取重载方法。
    如果编译器在同一阶段找到了多个适配的方法,那么它会选择一个最贴切的方法,决定贴切程度的一个关键就是形式参数类型的继承关系。编译器会选择参数的子类为形参的那个方法。

    如果子类中定义了与父类中非私有方法同名的方法,且参数类型相同。如果这两个方法都是静态方法,那么子类中的方法隐藏了父类中的方法如果这两个方法都不是静态的且都不是私有的,那么子类的方法重写了父类中的方法。
    JVM中关于方法重写的判定同样基于方法描述符。如果子类定义了与父类中非私有、非静态方法同名的方法,那么只有当这两个方法的参数类型以及返回类型一致,JVM才会判定为重写。

    对于重写方法的调用:根据调用者的动态类型,来选取实际的目标方法。
    编译器会通过生成桥接方法来实现Java中的重写语义。

    JVM如何识别方法
    JVM识别方法的关键在于类名、方法名和方法描述符。方法描述符由方法的参数类型以及返回类型所构成。
    JVM中的静态绑定指在解析阶段便能够直接识别目标方法的情况。动态绑定指需要在运行过程中根据调用者的动态类型来识别目标方法。

    JVM静态绑定和动态绑定
    静态绑定指在解析时就能够直接识别目标方法的情况。
    动态绑定指需要在运行过程中根据调用者的动态类型来识别目标方法的情况。

    符号引用转实际引用
    对于非接口符号引用
    1、在目标类中查找符合名字及描述符的方法。
    2、如果没有找到,在目标类的父类中继续搜索,直到Object类。
    3、如果没有找到,在目标类所直接实现或简介实现的接口中搜索,这里搜索的目标方法必须是非私有、非静态的。如果目标方法在间接实现的接口中,则需满足目标方法与该接口之间没有其他符合条件的目标方法。

    对于接口符号引用
    1、在目标接口中查找符合名字及描述符的方法。
    2、如果没有找到,在Object类中的公有实例方法中搜索。
    3、如果没有找到,则在目标接口的超接口中搜索。搜索结果同非接口符号引用第三步一致。

    对于可以静态绑定的方法调用,实际引用是一个指向方法的指针。对于需要动态绑定的方法调用,实际引用则是一个方法表的索引。

    总结
    重载指方法名相同而参数类型不同的方法之间的关系,重写指方法名相同且参数类型也相同的方法之间的关系。
    JVM识别方法会区分方法名、参数类型和返回类型。Java识别方法只区分方法名和参数类型。
    JVM在解析阶段已经区分了重载方法。