用我最近在看的一部电视剧《三国机密》来通俗一点的说:
刘协死后,刘平用皇兄的身份当了皇帝,两人一模一样(参数类型、返回值等),但是刘协心铁,刘平仁慈,他们当皇帝时做的事不同(方法体不同),这就是覆盖(又叫重写),
秦国的徐福和三国的徐福(徐庶),名字一样(方法名),但是是两个人,长得不一样(参数类型),做事也不同(方法体不同),这就是重载。
例子:
public class TestOverRL {
public static void main(String args[]) {
Animal a = new Dog();
a.run();
int c = a.run("Cat");
}
}
class Animal {
protected void run() {
System.out.println("Animal is running");
}
public int run(String s) {
return 0;
}
}
class Dog extends Animal {
public void run() {
System.out.println("Dog is running");
}
public int run(String s) {
System.out.println("Dog is running with " + s);
return 0;
}
}
程序中,Animal类中的无参run方法和Dog中的无参run方法构成覆盖(又叫重写,顾名思义,将同样的方法再写一遍,这个同样就是完全一致,包括名字参数返回值等等),两者长得一模一样,但是方法内部的实现不同,调用时,用新的方法覆盖了旧方法;
Dog类中的两个run方法构成重载,方法长得不一样了(参数样式、返回值都不同),调用时要看具体传入的是什么来确定调用的是哪一个方法(他们返回值也不同,用的时候要注意!~当然用错会报错~)。
运行结果:
如结果所示,无参的run,a对象调用时,用重写的方法覆盖了原方法,由此可见重写又叫覆盖的原因。
顺便一提,在用Animal类构建具体Dog对象时,该对象调用的是Dog的方法,这也是java多态的一种体现,若是Dog类中没有重写无参run方法,该对象会调用Animal类中的无参run。我将Dog中无参run注释掉后运行,如下所示:
一些要注意的(参考前人总结):
override(覆盖、重写)
1、覆盖方法前后参数标志需完全相同;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
(长相相同)
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
overload(重载)
1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序;
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
4、对于继承来说,如果某一方法在父类中的访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果
5、重载方法与原方法的返回值可以不同(徐福只是名字相同而已,重载方法也一样只是名字相同)