关于test接口、test1接口与MyClass类的两个语句语义差异咨询
聊聊这两个接口转型语句的语义差异
嘿,先默认你说的编号1、2的语句是类似这种常见场景哈:
- 语句1:
test obj = new MyClass(); - 语句2:
test1 obj = new MyClass();
先说结论:如果只调用两个接口共有的方法,执行结果确实几乎一样,但二者的语义差异其实挺明显的,具体来拆解下:
最核心的区别:编译时的类型约束
- 语句1里的引用
obj,编译时类型是test——这意味着你只能调用test接口里定义的所有方法,哪怕test1或者MyClass有额外的方法,编译阶段直接就会报错,根本跑不起来。 - 语句2的引用
obj,编译时类型是test1,那你就能调用test加上test1接口里的所有方法,只要MyClass实现了这些方法,就能正常执行。
为啥执行结果会看起来一致?
当你调用的是test接口里的方法时,不管是用test还是test1类型的引用,最终都会指向MyClass实例里的对应实现逻辑,所以执行出来的结果是一样的——毕竟底层都是同一个对象嘛,只是编译时给你划的“可调用范围”不一样。
举个具体的例子就懂了:
假设test接口只有void doTest();,test1继承test后加了个void doTest1();,MyClass把这两个方法都实现了。
- 用
test类型的引用,你只能调doTest(),要是想调doTest1(),编译器直接给你红叉; - 用
test1类型的引用,两个方法都能调,而且调doTest()的时候,和前者的执行逻辑完全相同。
所以你说的“执行结果几乎一致”只在调用共同方法的场景下成立,但从语义(也就是编译阶段的约束、能调用的方法范围)来看,二者是有明确区别的哦。
内容的提问来源于stack exchange,提问作者Zaid Khan
相关产品推荐
相关产品推荐

