面向对象编程——重写和多态
向上转型和向下转型
向上转型和向下转型是认识多态的基础
向上转型:对于一对父子关系的类,假如用父类的引用类型去接收子类的的引用称为向上转型
向下转型:对于一对父子关系的类,假如用子类的引用类型去接收父类的的引用称为向上转型
对于赋值的场景可以有以下三个:
- 直接赋值
- 方法传参
- 方法返回值
instanceof关键字
在使用向下转型的时候会有不安全的隐患,比如下面的代码
class Animal {public void eat() {System.out.println("Animal.eat()");}
}class Dog extends Animal {public void eat() {System.out.println("Dog.eat()");}
}class Cat extends Animal {public void eat() {System.out.println("Cat.eat()");}
}public class Test {public static void main(String[] args) {Dog dog = new Dog();Cat cat = new Cat();Animal animal = dog; // Cat cat2 = (Cat) animal; // 这一行代码报错;因为animal是Dog类的引用,不能强转成Catif (animal instanceof Cat) {Cat cat2 = (Cat) animal;}}
}
这个时候可以使用instanceof
关键字,判断当前变量的引用是否和需要强转的类一致;可以避免向下转型的错误。
重写
重写是发生在继承关系中,在子类中重写父类相同的成员方法;以达到多态的目的
重写的三个要求:
- 方法名必须相同
- 参数列表必须相同(类型、个数、顺序)
- 返回值必须相同(也可以是构成父子关系,也称为协变)
重写的注意事项:
4. 被 private、static、final 修饰的方法不能重写
5. 子类的访问权限修饰符的权限必须大于等于父类的(private < 默认权限 < protected < public)
6. 构造方法不能发生重写
多态
多态的产生主要是为了降低代码的重复性,避免使用大量的 if - else;在修改的时候也更加方便。