第十三章 覆盖和多态
1.1 覆盖引入
/*
当前程序存在的问题(设计上的问题)??
鸟儿在执行move()方法的时候,最好输出的结果是:“鸟儿在飞翔”
但是当前的程序在执行move()方法的时候输出的结果是:“动物在移动”
很显然Bird子类从Animal父类中继承过来的move()方法已经无法满足子类的需求。
*/
public class OverrideTest01{
public static void main(String[] args){
// 创建鸟对象
Bird b = new Bird();
// 让鸟儿移动
b.move();
// 创建Cat类型对象
Cat c = new Cat();
c.move();
}
}
class Animal{
// 移动
public void move(){
System.out.println("动物在移动");
}
}
// 子类
class Bird extends Animal{
// 子类继承父类中,有一些“行为”可能不需要改进,有一些“行为”可能面临着必须改进。
// 因为父类中继承过来的方法已经无法满足子类的业务需求。
// 鸟儿在移动的时候希望输出“鸟儿在飞翔”
}
class Cat extends Animal{
// 猫在移动的时候,我希望输出:“猫在走猫步”
}
1.2 构成方法覆盖的条件
回顾一下方法重载
什么时候考虑使用方法重载overload
当在一个类当中,如果功能相似的话,建议将名字定义为一样,这样代码美观,并且方便编程。
什么条件满足之后出能够构成方法重载overload
条件1:在同一个类当中
条件2:方法名相同
条件3:参数列表不同(个数、顺序、类型)
-------------------------------------------------------------------------------------
什么时候我们会考虑使用“方法覆盖”呢?
子类继承父类之后,当继承过来的方法无法满足当前子类的业务需求时,
子类有权利对这个方法进制重新编写,有必要进制“方法的覆盖”。
方法覆盖又叫做:
方法重写,英语单词叫做:Override, Overwrite, 都可以。
比较常见的:方法覆盖、方法重写、override
重要结论:
当子类对父类继承过来的方法进行“方法覆盖”之后,
子类对象调用该方法的时候,一定执行覆盖之后的方法。
当我们代码怎么编写的时候,在代码级别上构成了方法覆盖呢?
条件1:两个类必须要有继承关系
条件2:
重写之后的方法和之前的方法具有:
相同的返回值类型、
相同的方法名、
相同的形式参数列表
条件3:访问权限不能更低,可以更高。
条件4:重写之后的方法不能比之前的方法抛出更多的异常,可以更少。
注意事项:
注意1:方法覆盖只是针对方法,和属性无关。
注意2:私有方法无法覆盖。
注意3:构造方法不能被继承,所以构造方法也不能被覆盖。
注意4:方法覆盖只是针对于实例方法,静态方法覆盖没有意义。
public class OverrideTest02{
public static void main(String[] args){
Bird b = new Bird();
b.move();
Cat c = new Cat();
c.move();
}
}
class Animal{
}
class Bird extends Animal{
// 对move方法进行方法覆盖,方法迭重写,override
// 最好将父类中的方法原封不动的复制过来。(不建议手动编写)
// 方法覆盖,就是将继承过来的那个方法给覆盖掉了。
/*
public void move(){
System.out.println("鸟儿在飞翔");
}
*/
// protected表示爱保护的。没有public开放
// 错误:正在尝试分配更低的访问权限;以前为public
/*
protected void move(){
System.out.println("鸟儿在飞翔");
}
*/
}
class Cat extends Animal{
public void move(){