繁体   English   中英

Java多态 - 具体示例

[英]Java Polymorphism - Specific Example

我对以下示例有一些问题(更确切地说,有一个特定的行)。 这是代码(之后的问题):

public class Up
{
    public void cc(Up u) {System.out.println("A");}
    public void cc(Middle m) {System.out.println("B");}
}

public class Middle extends Up
{
    public void cc(Up u) {System.out.println("C");}
    public void cc(Down d) {System.out.println("D");}
}

public class Down extends Middle
{
    public void cc(Up u) {System.out.println("E");}
    public void cc(Middle m) {System.out.println("F");}
}

public class Test
{
    public static void main(String... args)
    {
        Up uu = new Up();
        Up pp = new Middle();
        Down dd = new Down();

        uu.cc(pp); // "A"
        uu.cc(dd); // "B"
        pp.cc(pp); // "C"
        pp.cc(dd); // "B"
        dd.cc(pp); // "E"
        dd.cc(dd); // "D"
    }
}

现在uu.cc(pp); uu.cc(dd); 非常明显,因为uu是Up一个实例,而pp “看起来像是一个Up ”(在编译时)。 dd最合适的方法是cc(Middle m)因为ddDown一个实例,它继承自Middle

我遇到的问题最多的是pp.cc(dd); dd.cc(dd) 关于在编译时或在运行时确定这些事情的时间和方式,我真的有点困惑。 如果有人能帮我理解,我会很高兴。

基本上,该方法签名被选择以基于编译时间类型所涉及的表达式的编译时间,和执行被选择在执行时,基于实际实现只是该方法的目标的。

所以在编译时, pp.cc(dd)尝试找到Up.cc(Down)的匹配Up.cc(Down) 最具体的匹配是Up.cc(Middle) ,这就是编译代码中的最终结果。 现在在执行时,它的实现将是Up.cc(Middle)因为Middle不会覆盖该方法签名。 因此它打印“B”。

现在在编译时, dd.cc(dd)尝试找到Down.cc(Down).的匹配Down.cc(Down). 这里有两个相关的选择 - Middle.cc(Down)参数完全匹配,或者Down.cc(Middle)目标类型完全匹配。 编译器更喜欢Middle.cc(Down) 在执行时,该方法再次未在Down被覆盖,因此它打印“D”。

重载决策规范的相关位是15.12,特别是15.12.2 - 确定方法签名

pp.cc(dd); 编译器必须在属于pp类型Up方法之间进行选择。 最合适的是cc(Middle m) 您不在Middle覆盖此方法,因此调用Up方法的运行时。

dd.cc(dd) ,编译器在属于DownMiddleUp方法之间选择,因为ddDown Middle的方法cc(Down)dd的类型完全匹配并被选中。

因此,编译时根据声明的变量类型和最合适的方法签名进行选择。 然后正常覆盖规则应用运行时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM