public int test(){
//执行子类的num方法
return num(1,2);
}
protected int num(int i,int j){
return i+j;
}
public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.test());
}
}
class Child extends Parent{
public int num(int x,int y){
return x-y;
}
}
那么这段代码的执行结果是-1,因为父类test方法调用的是子类的num方法。
java overload的原则 :
在java中overload要遵循两个原则:准确性和唯一性
例一:
public class TestOverLoad
{
public static void main(String[] args)
{
Test test = new Test();
test.print(null);
}
}
class Test
{
public void print(String some)
{
System.out.println("String version print");
}
public void print(Object some)
{
System.out.println("Object version print");
}
}
在这个程序中, test.print(null)中的null即是String又是Object,那么要执行那个函数呢 结果是它执行了 public void print(String some),原因就是准确性原则,String继承自Object.在java看来,在这个例子中说null是String类型的比说null是Object类型的更为准确.
例二:
public class TestOverLoad
{
public static void main(String[] args)
{
Test test = new Test();
test.print(null);
}
}
class Test
{
public void print(String some)
{
System.out.println("String version print");
}
public void print(Object some)
{
System.out.println("Object version print");
}
public void print(StringBuffer some)
{
System.out.println("StringBuffer version print");
}
}
在该例中,Test类多了一个函数,然而在编译时出现了错误.原因是该例违反了overload的唯一性原则
.String和StringBuffer之间不存在继承关系,因此不能说null属于它们两个中的那个类更准确,于是程序在执行时就会不知道该调用public void print(String some),还是该调用 public void print(StringBuffer some).