关于多态的疑问

关于多态的疑问

所谓编译看左边,运行看右边是什么意思?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小蓝 2022-06-01 09:58:08

同学你好~

    1.在编译期,编译器会自上而下依次检查每一句代码的语法正确性。这里的语法正确性在多态位置主要体现在“对象的引用类型与对象的实际类型是否匹配”,即new语句的对象与前面声明的类型是否兼容。例如Animal类型的引用里面存储Animal类型对象是兼容的,不会报错。Animal类型的引用里面存Dog类型的对象也是兼容,不会报错。但是Dog类型引用里面尝试存储Cat类型对象,就不兼容了,会报错。

    但是此时需要注意的是,此处仅是代码层面的检查,实际上编译器并不会真正的关心new语句创建了具体什么样的对象,这个对象的创建是在运行期才确定的。通常我们会认为,代码已经写明白了创建了什么对象,编译器应该知道这个对象是什么,而实际上,编译器并不知道,它只关心是否合法。

    所以就会出现,编译器在确定方法调用时,仅可以检查引用类型中是否有这个方法,如果有,就不报错。

    这也就是所说的“编译看左边”。

    2.在运行期,虚拟机要根据对象的实际类型进行对象的创建,并且根据对象的实际类型去调用该类中的方法实现方式。此时可以看到,所关注的都是实际类型,也就是new语句中创建的对象的类型。

    这也就是所说的“运行看右边”。

祝学习愉快~


  • 提问者 慕少6425323 #1

    为什么成员变量是编译看左边,运行看左边.

    而成员方法是编译看左边,运行看右边呢?

    2022-06-01 16:17:18
  • 好帮手慕小蓝 回复 提问者 慕少6425323 #2

    同学你好,多态的特性是针对方法的,与属性无关。所以在陈述多态时,必要条件就是“子类重写父类的方法”。

    而成员属性与多态无关,只关注引用类型。

    祝学习愉快~

    2022-06-01 16:33:57
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师