You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于给定Java接口代码,判断实现编译时还是运行时多态?

Java接口实现的多态类型分析及方法调用时机说明

多态类型判断

这段代码同时涉及两种多态:

  • 编译时多态:接口RemoteControl里定义了两个同名的turnOn方法,参数列表不同(无参/带int参数),这属于方法重载。重载方法的匹配逻辑在编译阶段就完成了,编译器会根据调用时传入的参数个数、类型,直接确定要调用哪个签名的方法。
  • 运行时多态:代码里做了向上转型——RemoteControl tvRemote = new TV();,此时tvRemote的编译类型是接口RemoteControl,但实际运行时指向的是TV对象。当调用turnOn方法时,虽然编译时已经确定了方法签名,但具体执行哪个类的方法体,是在运行时由实际对象的类型决定的,这就是运行时多态的核心体现。

变量声明与方法调用的时机拆解

1. RemoteControl tvRemote = new TV();的行为时机

这条语句分两个层面:

  • 变量tvRemote的编译类型是RemoteControl,这个在编译时就定死了——编译器只会允许调用RemoteControl接口里声明的方法,要是调用TV类独有的方法,编译直接报错。
  • 变量tvRemote的实际运行类型是TV,这个是程序运行到这条语句时才确定的,JVM会在此时创建TV对象,并把它赋值给tvRemote。

2. turnOn()和turnOn(5)的调用时机

  • 选择重载方法:编译时就完成了。编译器根据调用时传入的参数(无参数/int类型的5),匹配RemoteControl里对应的方法签名,确定要调用无参的turnOn()还是带int参数的turnOn(int)。
  • 执行方法体:运行时才确定。因为tvRemote实际指向的是TV对象,JVM在运行时会找到TV类里实现的对应方法体来执行,而不是接口的抽象方法(接口本身没有方法体)。

内容的提问来源于stack exchange,提问作者Ash Kecthum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:08:18