正在回答 回答被采纳积分+1
1回答
好帮手慕小蓝
2022-06-01 09:58:08
同学你好~
1.在编译期,编译器会自上而下依次检查每一句代码的语法正确性。这里的语法正确性在多态位置主要体现在“对象的引用类型与对象的实际类型是否匹配”,即new语句的对象与前面声明的类型是否兼容。例如Animal类型的引用里面存储Animal类型对象是兼容的,不会报错。Animal类型的引用里面存Dog类型的对象也是兼容,不会报错。但是Dog类型引用里面尝试存储Cat类型对象,就不兼容了,会报错。
但是此时需要注意的是,此处仅是代码层面的检查,实际上编译器并不会真正的关心new语句创建了具体什么样的对象,这个对象的创建是在运行期才确定的。通常我们会认为,代码已经写明白了创建了什么对象,编译器应该知道这个对象是什么,而实际上,编译器并不知道,它只关心是否合法。
所以就会出现,编译器在确定方法调用时,仅可以检查引用类型中是否有这个方法,如果有,就不报错。
这也就是所说的“编译看左边”。
2.在运行期,虚拟机要根据对象的实际类型进行对象的创建,并且根据对象的实际类型去调用该类中的方法实现方式。此时可以看到,所关注的都是实际类型,也就是new语句中创建的对象的类型。
这也就是所说的“运行看右边”。
祝学习愉快~
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星