OverLoad 与 Override 的区别
一、重写(Override)
注意:重写的前提是类之间具有继承关系。
在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。
- 发生在父类与子类之间
- 方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同
- 访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
- 重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常
什么是重写?
- 重写也称覆盖,是在继承关系下,子类对父类方法代码的修改。
举例:动物类(Animal)中的吃方法(eat),有些动物吃草,有些动物吃肉,都是吃的功能,但是动物不一样,实现的方式也不一样。
为什么要重写?
- 父类已具有某个功能的方法,子类假如有相同功能的方法,使用重写的方式更加便利,不会造成子类既继承得到了父类的这个功能,又自己拥有一个同样的功能而方法名却不一样的尴尬境地。
- (2)继承是多态的前提,重写方法也是为了多态的扩展性的。
什么情况下才能重写?
- 当子类跟父类拥有相同的功能,但是实现方式不同时,子类重写父类的方法即可。
如何重写?
方法的重写要遵循“两同两小一大”的原则:
- 两同:方法名和参数列表必须相同
- 两小:返回值类型、声明异常 比(被重写的)父类的小(或一样)
- 一大:访问修饰符比(被重写的)父类的大(或一样)
二、重载(Overload)
在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。
- 重载Overload是一个类中多态性的一种表现
- 重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序)
- 重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准
区别:
- overload 重载规则是同名不同参,方法名相同,参数类型、个数、顺序至少有一 个不相同(与返回值、参数名、抛出的异常都没有关系);
- overload 可以发生在父类、同类、子类中。override 重写的规则是方法名、参数、返回值相同,发生在父子类之间,而且子类不能抛出比父类更多的异常,被重写的方法一定不能定义成 final。
- 重写在运行时决定,重载是在编译时决定。并且覆盖和重载的机制不同
- 重写实现的是编译时的多态性,重载实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。
static 方法能不能被 overload,override?
可以被继承,但是不能被重写,如果父子类静态方法名相同,则会隐藏父类方法。
掌握继承状态下父类、子类构造方法、static代码块、代码块的执行顺序:
(1)父类的静态代码块
(2)子类的静态代码块
(3)父类的代码块
(4)父类的构造方法
(5)子类的代码块
(6)子类的构造方法