为何要方法覆盖:
当前程序存在的问题(设计上的问题)
鸟儿在执行move方法的时候,最好输出的结果是鸟儿在飞翔,但是当前的程序在执行move方法的时候输出的结果还是动物在移动,所以父类方法无法满足子类的业务需求。
public class override{
public static void main(String[] args){
Bird b = new Bird();
b.move();
}
}
//父类
class Animal{
//移动
public void move(){
System.out.println("动物在移动!");
}
}
//子类
class Bird extends Animal{
//子类继承父类中,有一些行为可能不需要改进,有一些行为可能必须改进
//因为父类中继承过来的方法已经无法满足子类的也无需求。
}
即当子类继承父类之后,继承过来的方法无法满足当前子类的业务需求时,子类有权利对这个方法进行重新编写,有必要进行“方法的覆盖”
方法覆盖:
public class override02{
public static void main(String[] args){
Bird b = new Bird();
b.move();
}
}
class Animal{
public void move(){
System.out.println("动物在移动!");
}
}
class bird extends Animal{
//对move方法进行方法覆盖override
//此时最好将父类中的方法原封不动复制过来
public void move(){
System.out.println("鸟儿在飞翔!");
}
}
重要结论:方法覆盖就是将继承过来的方法覆盖掉,
当子类对父类继承过来的方法进行方法覆盖之后,子类对象调用该方法的时候,一定执行覆盖之后的方法。
当我们代码如何编写时,在代码级别上构成了方法覆盖?
条件一:两个类必须要有继承关系。
条件二:重写之后的方法必须和之前的方法一模一样,具有相同的返回值类型,相同的方法名,相同的形式参数列表。
条件三:访问权限不能更低,可以更高。
条件四:重写之后的方法不能比之前的方法抛出更多的异常。
还有几个注意事项:
注意1:方法覆盖,只是针对于方法,和属性无关。
注意2:私有方法无法覆盖
注意3:构造方法不能被继承,所以构造方法也不能被覆盖。
注意4:方法覆盖只是针对于实例方法,静态方法覆盖没有意义。