有 Java 大佬在吗?遇到一个 动态绑定的问题,求指教 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
diangdiang

有 Java 大佬在吗?遇到一个 动态绑定的问题,求指教

  •  
  •   diangdiang Oct 5, 2017 3833 views
    This topic created in 3125 days ago, the information mentioned may be changed or developed.
    class A {
    public String show(A obj) { return ("A and A"); } 

    }

    class B extends A {

    public String show(B obj) { return ("B and B"); } public String show(A obj) { return ("B and A"); } 

    }

    public class OverrideTest {

    public static void main(String[] args) { A a2 = new B(); B b = new B(); String res = a2.show(b); System.out.println(res); // 感觉应该输出 B and B,实际输出 B and A } 

    }

    21 replies    2017-10-07 15:01:01 +08:00
    diangdiang
        1
    diangdiang  
    OP
       Oct 5, 2017
    校招笔试题,搞不懂啊,谢谢 ~
    rogerchen
        2
    rogerchen  
       Oct 5, 2017
    a2 中 B and B 对应的 overloading 不参与 resolution
    diangdiang
        3
    diangdiang  
    OP
       Oct 5, 2017
    为啥不参与呢,能详细点吗?小白求助
    rogerchen
        4
    rogerchen  
       Oct 5, 2017
    @diangdiang a2 的类型是 A,A 没有 public String show(B obj) 这个方法。
    diangdiang
        5
    diangdiang  
    OP
       Oct 5, 2017
    哎呀呀,妙啊!多谢大佬
    ioc
        6
    ioc  
       Oct 5, 2017 via Android
    考重载和多态的混淆?
    sosloop
        7
    sosloop  
       Oct 5, 2017 via Android
    就是考多态,函数重载和重写
    jimisun
        8
    jimisun  
       Oct 6, 2017 via Android
    @rogerchen 既然 A 类型没有 public String show(B obj 这个方法 为什么 a2.show(b);还能传入 b 类型的参数呢?
    lihongjie0209
        9
    lihongjie0209  
       Oct 6, 2017
    这是函数重写, 多态(动态绑定)的基础是有一个类型(interface), 然后有不同的类(class)来实现, 最后在运行时(runtime)绑定.
    Spectre
        10
    Spectre  
       Oct 6, 2017
    @jimisun 同疑惑
    Sikoay
        11
    Sikoay  
       Oct 6, 2017 via Android
    a2 向上转型为 A,这时 show( B obj)方法丢失,然后调用 a2.show(b)时,由于 a2 中只有重载 show(A obj)过的方法,即调用此方法,输出"B and A",不知道这样解释对不对
    Sikoay
        12
    Sikoay  
       Oct 6, 2017 via Android
    @jimisun
    @Spectre

    因为 B 为 A 的子类啊,所以即使 show(B obj)丢失之后也能够传入 B,但是此时传入的 B 已经被向上转型为 A 了
    Spectre
        13
    Spectre  
       Oct 6, 2017
    @Sikoay B 继承于 A 能传 A 的都能传 B 好像是哎
    Sikoay
        14
    Sikoay  
       Oct 6, 2017 via Android
    @Spectre 是的,但是在传递 A 的方法中就不能调用 B 的方法,但是还可以调用 B 重载的 A 的方法,并且能够正常运行,这就是运行时绑定
    wenzhoou
        15
    wenzhoou  
       Oct 6, 2017 via Android
    编译后 调用的是 invokevirtual instance:a2 method:show ( A )
    编译时候就决定了一部分。运行时候决定了另一部分。
    Doodlister
        16
    Doodlister  
       Oct 6, 2017
    B 是 A 的子类 A a2 = new B(); 是 B 向父类向上转型, 所以只能调用父类中声明的方法。即 show(A obj)。
    a2.show(b); 这样调用也是没毛病的 因为 b 是 A 的子类对象 所以 可以向上转型为 A 类型作为参数。
    guodong110
        17
    guodong110  
       Oct 6, 2017 via Android
    承链中对象方法的调用存在一个优先级:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。这里 this.show((super)O)满足,又由于在子类向上转型的时候,如果调用的方法是非静态方法且被子类覆写了,那么程序将会调用的是子类的方法,故输出 B and A
    8rB61FLBPVSxW2C8
        18
    8rB61FLBPVSxW2C8  
       Oct 6, 2017
    声明 a2 的 A 类是静态类型,B 是实际类型,经过动态绑定后,调用的是实际实际类型中的方法
    loopback
        19
    loopback  
       Oct 6, 2017
    静态多分派(两个宗量)
    动态单分派(一个宗量)
    vwok
        20
    vwok  
       Oct 7, 2017 via Android
    diangdiang
        21
    diangdiang  
    OP
       Oct 7, 2017
    多谢各位热心 V 友!
    About     Help     Advertise     Blog     API     FAQ     Solana     6044 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 71ms UTC 02:03 PVG 10:03 LAX 19:03 JFK 22:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86