Java变量混乱?

Java变量混乱?,java,oop,Java,Oop,我对这个代码有问题 class A{} class B extends A{} public class TestExms { 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); Sy

我对这个代码有问题

class A{}
class B extends A{}

public class TestExms {
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.println(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";}

}
当我运行此代码时,输出将为“-434”。 问题是为什么: 这
A[]aa=新的A[2]当传递到
筛选器(aa)时此操作不调用
静态空洞筛选器(A[]…a2){s+=“1”}
。它将调用此方法
staticvoidsifter(objecto){s+=“4”;}
谁能给我解释一下吗? 这个
(A[]…a2)
里面发生了什么

当通过筛子(aa)时;这不称为静态空洞筛选器(A[]…a2){s+=“1”;}

您在
varargs
中给出了错误的语法(似乎很困惑)

您将您的功能定义为

static void sifter(A[]... a2) {
        s += "1";
    }
这意味着您接收的是
A[]
的数组,而不是
A

当您将签名更改为

static void sifter(A... a2) {
        s += "1";
    }
当你写作时

static void sifter(A[]... a2) {
        s += "1";
    }
这相当于

static void sifter(A[] a1, A[] a2, A[] a3) { // and so on 
        s += "1";
    }
因此,当您将A[]传递给它时,它将While数组视为
对象,而不是
A[]

您在varargs中给出了错误的语法no really。。值得注意的是,当您从程序
筛选器(aa)中删除方法
筛选器(对象o)
是对方法
筛选器的有效调用(A[]..aa)