输出:
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");
}
}
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
public void foo(String args){
System.out.println("Alpha:foo");
}
就会输出:
Beta:foo
Beta:foo
Beta:bar
Beta:bar
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个同名方法都匹配的时候,可变长参数的那个方法永远排在最后就行了