1.override重写/覆盖
override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。
(1)父类和子类中方法名、参数相同。
使用@Override ,compiler 会检查覆盖方法和被覆盖的方法签名是否完全一致
(2)严格继承:子类只能添加新方法,无法重写超类中的方法。
(3)父类中被定义为final的方法不能被重写。
(4)覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
(5)父类中的被重写函数体不为空,也就是说,对于其大多数子类型来说,该方法是可以被直接复用的。
(6)如果父类型中的某个函数实现体为空,意味着所有子类型都需要实现这个功能,但各有差异,没有共性,在每个子类中均需要重写。
(7)重写时,可以利用super()复用父类型中的函数功能,在此基础上可以进行扩展。
(8)能见度可以保持不变或增加,不能降低。
(9)实际执行时调用哪个方法,运行时决定。
(10)方法重写的时候,如果父类没有抛出任何异常,那么子类只可以抛出运行时异常,不可以抛出编译时异常。
如果父类的方法抛出了一个异常,子类重写时可以抛也可以不抛出异常,如果子类要抛出异常,那么子类在方法重写的时候不能抛出比被重写方法申明更加宽泛的编译时异常。
子类重写方法的时候可以随时抛出运行时异常(RuntimeException),包括空指针异常(NullPointerException),数组越界异常(ArrayIndexOutOfBoundsException)等。
2、overload
overload
(1)必须有 不同的参数列表:参数类型、个数、顺序至少有一个不相同。
可以有:相同/不同的返回值类型;
相同/不同的public/private/protected;
相同/不同的异常;
(3)可以在同一个类内重载,也可在子类中重载。
(4)不能通过访问权限、返回类型、抛出的异常进行重载;
(6)在编译阶段时决定要具体执行哪个方法。
3、对比
override:父类和子类具有相同的签名;子类重载了父类的方法后,子类仍然继承了被重载的方法。
overload:父类和子类签名不同;
public class Test{
public static void main(String[] args{
A a = new A();
a.p(10);
}
}
class B{
public void p(int i){
}
}
class A extends B{
//override
public void p(int i){
System.out.println(i);
}
}
class A extends B{
//overload
public void p(double i){
System.out.println(i);
}
}
大多数子类型来说,该方法