Day57 Java面向对象12 多态
Day56 Java面向对象12 多态
1.多态的定义
多态(Polymorphism):同一个行为(方法),在不同对象上表现出不同的形态。
2.多态的条件
①存在继承关系
②子类重写父类方法
③父类引用指向子类对象
父类:Animals
子类:Dog
子类:Cat
//回顾创建对象实例
引用类型 对象实例名 = new 实例类型();Animal dog1 = new Dog();
Animal cat1 = new Cat();
//上面的创建实例方法就是父类引用(Animal) 指向子类对象(Dog,Cat)
3.多态的表现
- 编译看左边,运行看右边
①编译时:a1 和 a2 的类型是 Animal(编译器只看父类有没有 sound 方法)
②运行时:a1 实际是 Dog,a2 实际是 Cat,所以a1是汪汪汪,a2是喵喵喵。这就是动态绑定,也是多态的核心
class Animal {public void sound() {System.out.println("动物发出声音");}
}class Dog extends Animal {@Overridepublic void sound() {System.out.println("汪汪汪");}
}class Cat extends Animal {@Overridepublic void sound() {System.out.println("喵喵喵");}
}
public class Test {public static void main(String[] args) {Animal a1 = new Dog(); // 父类引用 -> 子类对象Animal a2 = new Cat();a1.sound(); // 输出:汪汪汪a2.sound(); // 输出:喵喵喵}
}
4.多态的优点
①提高代码复用性: 父类一个统一的方法,子类可以自由拓展
②提高代码可维护性: 通过新增子类就可以拓展功能,不需要修改父类
③低耦合: 调用方只关心父类接口,不需要关注具体实现
5.注意点
①多态是方法的多态,属性没有多态
②多态只能调用父类中拥有的方法,但运行结果由子类决定
③子类中独有,父类没有的方法,无法通过父类引用(父类类型 对象实例名 = new 子类类型();)直接调用
例:
//父类
public class Animals {private String name;public void sound(){System.out.println("动物的叫声");}
}
//子类
public class Bird extends Animals{private String name;@Overridepublic void sound() {System.out.println("喳喳喳");}public void fly(){System.out.println("小鸟飞起来了");}
}
//启动器
public class App {public static void main(String[] args) {Animals a1 = new Bird();a1.sound(); //输出:喳喳喳 a1.fly(); //报错 }
}
解释
父类中存在soud方法,所以父类引用的a1可以调用a1.soud
具体执行来到a1对象类型的Bird,因此soud执行的是输出“喳喳喳”
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
父类中不存在fly方法,所以a1不能直接调用fly方法,系统报错
但可以通用 ((Bird)a1).fly(); 将a1类型强制转换为Bird,再调用fly方法