关于重载与重写实现机制的理解

228 阅读2分钟

重载(同一类中)

1.方法名称相同

2.参数列表不同(个数, 类型,参数类型顺序)与 返回值无关

3.重载方法发生在编译时,因为编译器可以根据参数的类型来选择使用哪个方法

为什么重载不能根据返回值类型区分?

Java语言层面 方法特征签名 == 方法名 + 描述符(参数类型+参数个数+参数顺序)

JVM层面 方法特征签名 == 方法名 + 描述符(参数类型+参数个数+参数顺序+返回值类型)

在语言层面我们只关心方法的执行,而不关心返回值

(21条消息) Java语言层面和JVM层面方法特征签名的区别 及 实例分析尐譽的博客-CSDN博客java特征签名

重写(子类和父类)

Java的方法重写是多态的体现:允许子类在继承父类部分功能同时,拥有自己独特行为。

1.重写方法必须和父类保持一致(返回值类型、方法名、参数列表)

2.子类中重写方法的访问权限不能低于父类中方法的访问权限

3.重写方法发生在运行时,

JVM如何确定方法

每个类在方法区有它的虚方法表,存放着各方法的实际入口地址。JVM 在执行 invokevirtual 时(final 方法除外),会从实际类型的虚方法表查询(没找到会继续查询父类的虚方法表)。

类似的,invokeinterface 执行时会用到接口方法表。

方法表一般在类加载-连接阶段进行初始化,准备了类的变量初始值后,JVM 会把该类的方法表也初始化完毕。

注:invokestatic、invokespecial、final 方法,都能在编译期确定方法,所以 JVM 会在类加载-解析阶段,把这些方法的符号引用替换成直接引用。(final 方法是用 invokevirtual 执行的,因为不能被重写,所以编译时就能确定)

Java 多态:深入解析 方法重写(Override) 、重载(Overload)及其区别 - 云+社区 - 腾讯云 (tencent.com)

Java及JVM是如何识别重载、重写方法的? - 云+社区 - 腾讯云 (tencent.com)

\