Java中的覆盖和重载
一、覆盖(重写)(Overriding)
覆盖是什么?
举个例子:
package offer;
public class TestDemo{
public static void main(String[] args){
new Human().eat();
new Father().eat();
}
}
class Human{
public void eat(){
System.out.println("吃饭");
}
}
class Father extends Human{
public void eat(){
System.out.println("不吃饭");
}
}
结果:
由以上可知:
该例中子类继承了父类,但重写了父类的方法,虽然是从父类中拿到的方法但重写之后与父类方法有了区别,因此称为覆盖(即子类方法覆盖了父类方法)
二、重载(Overloading)
重载是什么?
举个例子:
package offer;
public class TestDemo{
public static void main(String[] args){
new Human().person();
new Human().person(6);
new Human().person(6,"帅");
}
}
class Human{
public void person(){
System.out.println("高");
}
public void person(int i){
System.out.println(i+" "+"富");
}
public void person(int i,String j){
System.out.println(i+" "+j);
}
}
运行结果:
由此可知:
该例子里写了多个print方法,但参数不同,因此可以运行,这也就是重载的含义,一个类中可以有多个同名不同参(参数列表不同)的方法。
三、两者之间的区别
区别 | 覆盖 | 重载 |
---|---|---|
实现上 | 子类对父类方法的重写 | 同一个类中建立多个同名方法 |
参数 | 与父类同名同参 | 与别的方法同名不同参 |
返回 | 子类与父类返回类型要一致 | 没有要求 |
权限 | 1.子类不能覆盖父类的private方法,否则在其子类中只是新定义了一个方法,并没有对重写 2.被重写的不能是final类型,因为final类型是无法重写的 3.被重写的不能是static | 无此要求 |
重写次数 | 父类一个方法只能在子类覆盖一次 | 重载只要参数不同,可以多次 |
要求 | 覆盖是针对父类方法的重写 | 同类中的方法均可重载 |
异常 | 重写要求子类比父类抛出更少的异常 | 无此要求 |
- | 重载是编译时的多态 | 重写是运行时多态 |