class Alpha {
public void foo(String... args) {
System.out.print("Alpha : foo");
}}public class Beta extends Alpha {
public void foo(String a) {
System.out.print("Beta : foo");
} public static void main(String[] args) {
Alpha a = new Beta(); a.foo("test"); }
}new Beta();了为什么不用他的foo

解决方案 »

  1.   

    估计是:参数类型不同,不算重写,而类型又是A,所以调的A的foo.
    类型改成B,就掉B的foo了。
      

  2.   

    你没有覆盖Alpha 中的方法,当然还是调用Alpha 的方法了。覆盖要参数一致才行。
      

  3.   


    class Alpha {
        public void foo(String... args) {
            System.out.print("Alpha : foo");
        }}public class Beta extends Alpha {
        public void foo(String... args) {//这里的参数要和Alpha一致
            System.out.print("Beta : foo");
        }    public static void main(String[] args) {
            Alpha a = new Beta();        a.foo("test");    }
    }
      

  4.   

    String...表示任意个String作为参数传入的
    所以你写的在子类的方法并没有覆盖他.
    所以就会出现这样的结果了
      

  5.   

    变长参数 String ...args 相当于 String []args ,只不过变长多一些特性。
    上面参数是String [] 下面是 String ,所以不是重写。下面改为String[] 或String ...估计就是重写了
      

  6.   

    编译看前面,运行看后面,编译能通过,运行的是运行Beta类的foo()结果应该是Beta : foo!
      

  7.   

    void foo(String a)是对void foo(String... args)的重载;因为方法名相同,参数列表不同,所以并未覆写。
    如果想防止此情况的发生,可使用:@Override
    例如:
    class Alpha {
        public void foo(String... args) {
            System.out.print("Alpha : foo");
        }}public class Beta extends Alpha {
        /*编译不通过,直到对父类foo方法覆盖*/
        @Override  public void foo(String a) {
            System.out.print("Beta : foo");
        }    public static void main(String[] args) {
            Alpha a = new Beta();        a.foo("test");    }
    }
      

  8.   

    问题是出在这里 Alpha a = new Beta(); 这个是向上转型,所以调用的是父类的方法Beta a = new Beta(); 这样声明的话调用的就是子类的方法了
      

  9.   

    void foo(String a)是对void foo(String... args)的重载;因为方法名相同,参数列表不同,所以并未覆写。如果要实现多态的话,必须覆写父类的方法。方法的签名必须一致 。
      

  10.   

    对了补充一下,
    void foo(String... args)参数相当于传一个String[].基本上等同于void foo(String[] args)