前言
重写与重载规矩太多,容易混淆,有些规则实际代码中又不经常用到,容易遗忘,特写下此文加以区分
正文
重写
使用场景
在使用继承的时候,我们可以在子类中重写父类所定义的方法
可以被重写的方法
除了父类方法中修饰符为 final 、private、static以外的方法都可以在子类中被重写
重写规则
1、重写的方法必须和被重写的方法具有相同的方法名称、参数列表一致
2、返回类型是父类被重写方法类型的子类或者本身 注①
3、重写的方法访问修饰符一定要大于被重写方法的访问修饰符(public > protected > default > private)
4、重写的方法抛出的所有异常能让被重写方法抛出的异常囊括,也就是说重写方法是被重写方法的子类,不能有被重写方法抛出的异常不包括的异常 注②注①:协变返回类型指的是子类中的成员函数的返回值类型不必严格等同于父类中被重写的成员函数的返回值类型,而可以是更”狭窄”的类型。Java 5.0添加了对协变返回类型的支持,即子类覆盖(即重写)基类方法时,返回的类型可以是基类方法返回类型的子类。协变返回类型允许返回更为具体的类型。
注②:根据里氏替换原则,父类引用子类对象,调用被重写方法,抛出的异常在运行期间可以捕捉子类的重写方法抛出的异常
代码解释重写异常规则
父类方法代码片段
public void print() throws Exception {
}
子类方法代码片段
@Override
public void print() throws ClassNotFoundException{
gooman = 3;
}
调用代码片段
public static void main(String[] args)
throws Exception{
Parent cc = new ChildClazz();
cc.print();
}
编译时cc.print抛出的是Parent的print方法异常Exception,在执行时,由动态绑定可以知道cc.print调用的是子类重写的方法,抛出ClassNotFoundException
如果Exception不能囊括ClassNotFoundException 而出现问题这就是在打编译器的脸
重载
使用场景
可以重载子类的方法,也可以重载父类中的方法
重载规则
1、参数列表不一致,类名相同。 注:参数列表不一致:个数、顺序、类型不一致
2、返回值、修饰符、抛出的异常可以与被重载方法相同,也可以不同,随意设定
由上规则可以知道,如果参数列表一致,类名一致的话,会编译错误,将两个方法看做同一个方法。重载关键区分相同类名为不同方法,在于参数列表