overload与override的区别 (二)

2014-11-24 10:18:51 · 作者: · 浏览: 1
rent {

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).