java吧 关注:1,297,020贴子:12,834,391

回复:今天发现我把继承理解错了

只看楼主收藏回复

多态的方式声明对象时记住了,编译看左边,执行看右边,记住这句话就行


IP属地:广东来自iPhone客户端19楼2022-11-15 09:32
回复
    创建dog对象的时候会先创建animal对象,animal有一个m的值,dog创建完后也有一个m的值。animal对象中有getM seeM。 dog对象中有seeM hello,还有一个指向animal中getM的getM
    。你调用dog的seeM会调用dog中的M值。调用getM会调用animal中getM的M值。把堆中对象的结构弄清楚就好了。


    IP属地:湖北来自Android客户端20楼2022-11-15 10:58
    回复
      2026-02-06 17:03:38
      广告
      不感兴趣
      开通SVIP免广告
      不是 你dog里没重写getm方法,凭什么不返回父类的属性?


      IP属地:江苏来自Android客户端25楼2022-11-15 11:41
      收起回复


        IP属地:广东来自iPhone客户端26楼2022-11-15 12:32
        回复
          编译时能确定就用变量的静态类型,不能确定就用实际类型。你那些方法都是虚方法,invokeVirtual指令,用的都是变量的实际类型,而实际类型他们都是dog,所以调用的都是dog中的方法,没有重写就用父类的方法签名指针(每个类在类加载的链接阶段会弄一个虚方法表这个东西)。所以你seem用的都是实际类型为dog的方法,所以都是返回6,而getm用的都是父类的。而你直接.m因为这个在编译阶段就能确认类型,所以用的是变量的静态类型(等于号左边的),分别返回animal和dog的m


          IP属地:浙江来自iPhone客户端27楼2022-11-15 12:47
          收起回复
            属性没有动态绑定机制


            IP属地:江西来自iPhone客户端29楼2022-11-16 15:00
            回复