SC Java程序员6考试

SC Java程序员6考试,java,Java,有考试的程序。有人能解释一下-434是怎么回答的吗: class A {} class B extends A {} public class ComingThru { static String s = "-"; public static void main (String[] args) { A[] aa = new A[2]; B[] ba = new B[2]; sifter(aa); sifter(ba)

有考试的程序。有人能解释一下-434是怎么回答的吗:

class A {}
class B extends A {}
public class ComingThru {
    static String s = "-";
    public static void main (String[] args) {
        A[] aa = new A[2];
        B[] ba = new B[2];
        sifter(aa);
        sifter(ba);
        sifter(7);
        System.out.print(s);
    }
    static void sifter(A[]... a2) { s += "1";}
    static void sifter(B[]... b1) { s += "2";}
    static void sifter(B[] b1)    { s += "3";}
    static void sifter(Object o)  { s += "4";}
}

谢谢大家!

编译器使用以下规则解析方法调用:不提及声明/可见性范围 1,如果存在完全匹配的签名,则调用解析为该方法。 2a,如果参数是原语,它会尝试将其框起来,以防不匹配。 2b,若不存在匹配项,它将尝试加宽,这意味着它将查找具有实际参数类型的超类型的声明。 3,如果不存在加宽的签名匹配,它将尝试匹配varargs。 如果仍然没有匹配,这意味着编译时错误。步骤2a和2b是互斥的 根据这些规则: -因为初始化
呼唤西夫特拉;解析为对象参数化方法,因为编译器首先尝试加宽。西夫特巴;解析为B[]arg ed方法,因为它是一个精确的签名匹配,然后最后一个再次解析为Object方法,规则是编译器首先尝试加宽,然后尝试varargs。因此,方法调用的最终结果是434。

您可能知道,当调用带有多组不同参数的方法时,Java会尝试调用最具体的方法。因此,例如,sifterObject方法可以应用于任何对象,但如果已知该对象是B[],则将调用更具体的sifterB[]方法

棘手的一点是,为了确保向后兼容性,当Java试图找出要调用的方法时,它首先查看是否有任何适用的非varargs方法。只有当没有这种方法时,它才会考虑VARARGS选项。< /P>
因此,当使用A[]调用sifter时,非varargs方法sifterObject是适用的,因此编译器甚至从不考虑sifterA[]..

您可能认为答案是-134。但实际上是-434

最后4个来自参数7,它只对应于带有Object参数的参数

3对应于直接静态孔隙筛B[]b1

前4个参数的原因是最近的参数是Object,因为A[]。。。a2无效。
如果是一个。。。a2,那么-134应该是正确的。

我猜它会调用:sifterObject o for siftera sifterB[]b1]for sifterba sifterObject o for sifterasifter7@skaffman好的,它测试了对Java中另一个模糊特性的理解,因此当您在现实生活中看到这样的代码时,您不仅可以进行WTFed,而且可以无误地重写它。这也提醒了语法糖的真实价格。亲爱的用户,请您解释一下-,4,3和4中哪一个是您关心的,为什么?不要结束这个问题。不管你喜欢与否,这都是一个值得回答的合理问题。@Paul:这是一个合法的问题,但也许我是这里的理想主义者,我认为用户应该先展示一些努力解决这个问题的证据,你不觉得吗?否则就有家庭作业垃圾的味道。顺便说一句,这不是一个公平的问题。即使你给出了答案,我也必须阅读JLS来了解它发生的原因。希望你在现实生活中永远不会遇到这样的情况——没有一个理智的API设计师会允许一个类有两个这样模棱两可的方法;你会发现sifterA[]。。。a2被称为。为了获得更多乐趣,请将此添加到代码中:A[][]aa2=新的A[1][1];aa2[0]=aa;sifteraa2;-这将调用第一个筛选,而不是最后一个筛选。我还在研究为什么…不,这是不对的。A[…]。。。a2是有效的,我想说的是它对那个论点无效。对不起我的英语。嘿,伙计们,非常感谢你们的投入,这非常有帮助。我正在自学Java,读了这本书3小时后,我惊讶于答案——434,而不是这个问题,甚至不知道从哪里开始。这不是家庭作业,这是贝茨写的关于SCJP6考试的书,第181页。如果我在这里违反了一些规则,我道歉。作为一个新来的人,祈祷宽大。感谢againI不要认为这本书是一个完全初学者的最佳来源,而是阅读oracle网页上的java教程。它们是完整的、最新的,涵盖了JavaAPI的所有重要方面和更多内容。顺便说一句,这个答案是不正确的。