1. 类维度
重载(Overload ) | 重写(Overwrite ) |
---|
类中的一组方法 | 子类重写父类的方法 |
2. 方法签名维度
public static String test(Integer name, String age) throws IOException { }
2.1 访问修饰符
重载(Overload ) | 重写(Overwrite ) |
---|
没有要求 | 子类权限修饰符 >= 父类 (eg:public > protected ) |
重写父类方法时,为什么子类的权限修饰符必须 >= 父类?
public class A{
public void fun() {}
}
public class C extends A{
@Override
protected void fun() {}
}
public class Prac{
public static void main(String[] args){
A a = new C();
a.fun();
}
}
参考:
java中子类再重写父类方法时,为什么子类的权限修饰符必须大于或者等于父类权限修饰符?
2.2 特征修饰符
重载(Overload ) | 重写(Overwrite ) |
---|
没有要求 | 父类方法是static 时,子类不存在重写 |
| 父类方法是final 时,子类不能重写 |
| 父类方法是abstract 时,子类必须重写(如果子类是抽象类可以不必重写) |
2.3 返回值
重载(Overload ) | 重写(Overwrite ) |
---|
没有要求 | 子类返回值 <= 父类 eg:Person < Animal |
重写父类方法时,为什么子类返回值要 <=
父类?
这里涉及到了向上转型,子类重写了父类的方法,有时候就需要用父类对象引用
来调用子类重写的方法
。
- 如果子类返回值
<=
父类时,可以直接向上转型; - 如果子类返回值
>
父类时,不能直接向上转型,需要强制类型转换,可是代码里没有强制转换, 所以会报错;
参考:
如何理解“子类重写父类方法时,返回值若为类类型,则必须与父类返回值类型相同或为其子类”
2.4 名字
重载(Overload ) | 重写(Overwrite ) |
---|
必须一致 | 必须一致 |
2.5 参数
重载(Overload ) | 重写(Overwrite ) |
---|
参数必须不一致(体现在:类型 个数 顺序) | 必须一致 |
2.6 异常
重载(Overload ) | 重写(Overwrite ) |
---|
没有要求 | 父类方法抛出运行时异常 ,子类可以不理会 |
| 父类方法抛出编译时异常 , 子类抛出异常的类型 <= 父类 eg:FileNotFoundException < IOException |
重写父类方法时,使用throws 抛出异常,为什么子类要 <= 父类?
class A{
public void method1() throws IOException {
}
}
class B extends A{
public void method1() throws FileNotFoundException{
}
}
public class TestThrowsException {
public static void main(String[] args) {
A a = new B();
try {
a.method1();
} catch (IOException e) {
e.printStackTrace();
}
}
}
参考:
java 重写或者覆父类方法的使用throws 抛出异常,为什么要小于父类父类
3. 方法体维度
重载(Overload ) | 重写(Overwrite ) |
---|
子类和父类不一致,一致的话还要重载干啥 | 子类和父类不一致,一致的话还要重载干啥 |
梗概
方法重写overwrite 方法重载overload
1.类 产生两个继承关系的类,子类重写父类的方法 一个类中的一组方法
2.权限修饰符 子类 >= 父类 (public > protected) 没有要求
3.特征修饰符 final static abstract 没有要求
父类方法是final 子类不能重写
父类方法是static 子类不存在重写
父类方法是abstract 子类必须重写(如果子类是抽象类,可以不重写)
4.返回值 子类 <= 父类 Person < Animal 没有要求
5.名字 子类与父类必须一致 名字必须一致
6.参数 子类与父类一致 每个方法的参数必须不一致(类型 个数 顺序)
7.异常 运行时异常 编译时异常 没有要求
父类方法抛出运行时异常,子类可以不理会
父类方法抛出编译时异常,子类抛出异常的类型 <= 父类
8.方法体 子类和父类不一致 通常不一致