多态的好处和弊端
- A:多态的好处
- a:提高了代码的维护性(继承保证)
- b:提高了代码的扩展性(由多态保证)
- B:案例演示
- 多态的好处
- 可以当作形式参数,可以接收任意子类对象
C:多态的弊端
不能使用子类的特有属性和行为。
class Demo04_Animal { public static void main(String[] args) { //Cat c1 = new Cat(); //c1.eat(); method(new Cat()); method(new Dog()); //开发中很少在创建对象的时候用父类引用指向子类对象 //直接创建子类对象更方便,可以使用子类中的特有属性和行为 //Animal a = new Cat(); } //Cat c = new Dog();狗是一只猫,这是错误的 /*public static void method(Cat c) { c.eat(); } public static void method(Dog d) { d.eat(); }*/ //如果把狗强转成猫就会出现类型转换异常,ClassCastException public static void method(Animal a) { //当作参数的时候用多态最好,因为扩展性强 //关键字 instanceof 判断前边的引用是否是后边的数据类型 //开发中很少这样做,一般都是父类具有方法A,子类重写方法A,然后把父类类型作为参数,子类传递进去 //如果想调用子类特有的方法,就必须强转之后才能去使用 if (a instanceof Cat) { Cat c = (Cat)a; c.eat(); c.catchMouse(); }else if (a instanceof Dog) { Dog d = (Dog)a; d.eat(); d.lookHome(); }else { a.eat(); } } } class Animal { public void eat() { System.out.println("动物吃饭"); } } class Cat extends Animal { public void eat() { System.out.println("猫吃鱼"); } public void catchMouse() { System.out.println("抓老鼠"); } } class Dog extends Animal { public void eat() { System.out.println("狗吃肉"); } public void lookHome() { System.out.println("看家"); } }