在java中,重载与重写都是多态的体现。重载(Overload)体现的是编译时多态,而重写(Override)体现了运行时多态。
重载(Overload):
定义:在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者参数顺序不同)则被视为重载。
需要说明一点的是,重载对返回类型没有要求,返回类型可以相同也可以不同,但不能通过返回类型是否相同来判断重载。
一个栗子:
public class Wine {
public static void main(String[] args) {
Wine wine = new Wine();
wine.drink();
wine.drink("五粮液");
}
public void drink(){
System.out.println("喝的是酒...");
}
public void drink(String name){
System.out.println("喝的是:"+name);
}
}
控制台输出:
喝的是酒...
喝的是:五粮液
总结:
1)重载(Overload)是一个类中多态的体现;
2)重载要求同名方法的参数列表不同(参数类型、个数、顺序);
3)重载方法返回值类型可以相同可以不同,不能以返回类型判别是否是重载方法。
重写(Override):
定义:子类把父类中已有的方法重新定义一遍。
说明:子类继承了父类原有的方法,但有时子类并不想原封不动的使用父类中的某些方法。所以在方法名、参数列表,返回类型 都相同的情况下,对方法体进行修改或重写。需要注意的是,子类函数的访问修饰符权限不能低于父类的。
一个栗子:
public class Wine {
public static void main(String[] args) {
WLY wine = new WLY();
wine.drink();
}
public void drink(){
System.out.println("喝的是酒...");
}
}
public class WLY extends Wine{
public void drink(){
System.out.println("喝的是五粮液");
}
}
控制台输出:
喝的是五粮液
总结:
1)重写发生在拥有继承关系的父类与子类之间;
2)方法名、参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同;
3)子类中重写方法的访问修饰符权限要大于父类中被重写的方法(public-->protected-->default-->private);
4)重写方法一定不能抛出新的异常或比被重写方法申明更加宽泛的检查型异常。
重载与重写的区别?
方法的重载与重写都是java中实现多态的体现。区别在于前者实现的是编译时多态,而后者实现的是运行时多态。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型、个数,顺序)则视为重载;重写发生在子类与父类之间,重写要求子类重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类重写更好访问,不能比父类被重写方法声明更多的异常(里氏替换原则)。重载对返回类型没有特殊的要求,不能根据返回类型来区别。
参考:https://blog.csdn.net/wintershii/article/details/80558739