遇到什么问题
子类拓展了父类,可以获得父类的部分方法和成员变量。可是当父类的某个方法不适合于子类本身的特征时,此时怎么办?
如:企鹅是鸟类中的一个特殊品种,所以企鹅类是鸟类的一个子类,但是鸟类有飞翔的功能,但是对应企鹅,飞翔的行为显然不适合于它。
怎么解决
使用方法覆盖(Override)
什么是方法覆盖
当父类的某一个行为不符合子类具体的特征的时候,此时子类需要重新定义父类的方法,并重写方法体.
方法覆盖规则(Override)(一同两小一大):
- 一同:
实例方法签名必须相同。 (方法签名= 方法名 + 方法的参数列表) - 两小:
1.子类方法的返回值类型是和父类方法的返回类型相同或者是其子类。
也就是说,子类可以返回一个更加具体的类.
2.子类方法声明抛出的异常类型和父类方法声明抛出的异常类型相同或者是其子类。
也就是说,子类方法中声明抛出的异常小于或等于父类方法声明抛出异常类型;子类方法可以同时声明抛出多个属于父类方法声明抛出异常类的子类(RuntimeException类型除外). - 一大:
子类方法的访问权限比父类方法访问权限更大或相等。
private修饰的方法不能被子类所继承,也就不存在覆盖的概念.
//方法覆盖 Override : 解决了子类继承父类后,父类方法不适合于子类的问题
public class OverrideDemo {
public static void main(String[] args) {
Bird bird = new Bird();
Penguin penguin = new Penguin();
bird.fly();//我是鸟类,我会飞
penguin.fly();//我是企鹅,但是我飞不了
}
}
//鸟类,有会飞的功能
class Bird {
public void fly() {
System.out.println("我是鸟类,我会飞");
}
}
//企鹅类,但是不会飞
class Penguin extends Bird {
//方法覆盖原则,一同两小
//同:方法名相同 :方法签名= 方法名 + 方法的参数列表
public void fly() {
System.out.println("我是企鹅,但是我飞不了");
}
}