基于给定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
相关产品推荐
相关产品推荐

