输出:
Alpha:foo //???
Beta:foo
Beta:bar
Beta:bar//代码
public class Alpha {
public void foo(String... args){
System.out.println("Alpha:foo");
}
public void bar(String args){
System.out.println("Alpha:bar");
}
public static void main(String[] args){
Alpha a = new Beta();
Beta  b = (Beta)a;
a.foo("");
b.foo("");
a.bar("");
b.bar("");
}}
class Beta extends Alpha{
public void foo(String args){
System.out.println("Beta:foo");
}
public void bar(String args){
System.out.println("Beta:bar");
}

}

解决方案 »

  1.   


    public void foo(String args){ 
    System.out.println("Beta:foo"); 
    } public void foo(String... args){ 
    System.out.println("Alpha:foo"); 
    } 两个方法签名不一样,一个接受一个String参数String args。一个可以接受多个String... args
      

  2.   

    恩,如果类Alpha中的foo()方法是这样定义的:
    public void foo(String args){ 
    System.out.println("Alpha:foo"); 

    就会输出:
    Beta:foo
    Beta:foo
    Beta:bar
    Beta:bar
      

  3.   

    String... args接受可变参数的。
      

  4.   

    首先你要明白:
    Alpha有2个方法
    public void foo(String... args)
    public void bar(String args)
     
    Beta有3个方法
    public void foo(String... args)  //继承下来的
    public void foo(String args)     //Overload
    public void bar(String args)     //Override然后再看对象a, a是用Alpha声明的, 但其实是个Beta
    a.foo("") a.bar("")
    先看Alpha类有没有能匹配的方法,
    若没有,是通不过编译的
    有的话,再看Beta类有没有Override这个方法,没有就调父类的方法,有就调子类的方法至于对象b, 应该没啥好说的
    只要明白同时有N个同名方法都匹配的时候,可变长参数的那个方法永远排在最后就行了