重写(Overriding)
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。重写有以下规则:
- 子类覆盖方法必须和父类有相同的函数名和参数。
- 子类的返回值和父类的返回值可以不同,但必须是父类返回值的派生类(jdk7及更高版本可以不同)。
- 子类抛出的异常必须比父类的异常范围小。
- 子类方法的访问权限必须比父类大(public>protected)
- 声明为final,static的方法不能被重写,但static的方法能够被再次声明。
- 子类和父类在同个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。若不在同一个包中,则子类只能重写父类中声明为public和protected的非final方法。
- 构造方法不能被重写。
重载(Overloading)
重载时在一个类里,方法名字相同而参数不同。返回类型可以相同也可以不同。每个重载的方法都必须有一个独一无二的参数类型列表。最常用的地方就是构造器的重载。重载有以下规则:
- 被重载的方法必须改变参数列表(参数个数或类型不一样)。
- 被重载的方法可以改变返回类型。
- 被重载的方法可以改变访问修饰符。
- 被重载的方法可以声明新的或更广的检查异常。
- 方法能够在同一个类中或者一个子类中被重载。
- 无法单纯以返回值类型作为重载函数的区分标准。
重写和重载的区别
区别点 | 重载方法 | 重写方法 |
---|---|---|
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
super关键字
在重写中会经常使用super这个关键字,那么为什么要使用super关键字?
- 子类中要访问父类的方法或变量。
- 子类中调用父类的构造器。
super使用的注意事项:
- 只能在构造方法或实例方法内使用super关键字,在静态方法和静态代码块里不能使用super关键字。
- 在子类构造方法中如果没有使用this关键字,会隐式调用父类的无参构造方法。
- 构造方法中this关键字和super关键字不能同时出现。