问题有点难描述,看以下代码:
class A {
    public void ma(String... names) {
System.out.println("Class A");
    }
}class B extends A {
    // 这里的参数如果是String[] names或String...names,最终输出结果是Class B
    public void ma(String names) {
System.out.println("Class B");
    }
}public class TestVarargs {
    public static void main(String[] args) {
A a = new B();
a.ma("Tom");// 这里调用的为什么是A中的函数?最好能描述一下对象在内存中的情况
    }
}最终输出结果是Class A;也就是a.ma("Tom");这里调用的是A中的函数。求解!!!如果有相关材料解答也可以告诉我,谢谢啦

解决方案 »

  1.   

    子类写错了...是String... names不是String names
      

  2.   

    就是这么写的,如果是String... names,就是输出Class B了,我已经在类B中注释了
      

  3.   

    class B 并没有重写class A中的ma方法。
      

  4.   

    class A和class B中的ma方法签名完全不一样,class A中的ma方法参数的类型是Object,而class B中的ma方法参数类型是String的,所以是2个方法,并不是override
      

  5.   

    方法重写。你可以知道。
    方法重写是必须写成 public void ma(String... names) {
        System.out.println("Class B");
        }
    这样的。你把参数改成String name就不是覆盖父类的方法了。
    想当于。你的B类中有ma(String... names),和ma(String name)两方法;
    这是可以够成方法重载的。方法重载。同名不同参与返回类型无关。
      

  6.   

    恩 你是对的,对函数重写误解了,
    public void ma(String... names)和public void ma(String names)不是重写,因为参数不一样,谢谢各位啦
      

  7.   

    class A {
        public transient  int a=0;
        public void ma(String... names) {
    System.out.println("Class A");
        }
    }class B extends A {
        // 这里的参数如果是String[] names或String...names最终输出结果是Class B
        public void ma(String names) {
    System.out.println("Class B");
        }
        public void ma(String... names) {
    System.out.println("Class B1");
        }
    }public class TestVarargs {
        public static void main(String[] args) {
    A a = new B();
    a.ma("Tom");// 这里调用的为什么是A中的函数?最好能描述一下对象在内存中的情况
        }
    }这样输出的是Class B1 谢谢啦 结贴啦
      

  8.   

    我想 LZ 的问题是不是这个:public class A {
        public void ma(String... names) {
         System.out.println("Method A");
        }
        public void ma(String names) {
         System.out.println("Method B");
        }
        public static void main(String[] args) {
    A a = new A();
    a.ma(""); // 这里输出了 Method B 。那 JVM 处理 a.ma("") 时,它为什么认为调用的是 ma(String names) 而不是  ma(String... names)
    }
    }
      

  9.   

    不是的,这个是函数重载,这它会优先调用ma(String names),也就是函数参数最接近的函数