动态绑定是指在“执行期间”,而非在编译期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
如下例子中,根据 lady 对象 的成员变量 pet 所引用的不同的实际类型而调用相应的enjoy()方法
三条规则:
1.要有继承
2.要有方法的重写
3.父类引用指向子类对象
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:
多态性是对象多种表现形式的体现。
现实中,比如我们按下 F1 键这个动作:
- 如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;
- 如果当前在 Word 下弹出的就是 Word 帮助;
- 在 Windows 下弹出的就是 Windows 帮助和支持。
同一个事件发生在不同的对象上会产生不同的结果。
多态的优点
- 1. 消除类型之间的耦合关系
- 2. 可替换性
- 3. 可扩充性
- 4. 接口性
- 5. 灵活性
- 6. 简化性
多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象
比如:
Parent p = new Child();
//定义Animal类 class Animal { private String name; Animal(String name) { this.name = name; } public void enjoy() { System.out.println("动物叫声........"); } //public abstract void enjoy(); } class Cat extends Animal { private String eyesColor; Cat(String n,String c) {super(n); eyesColor = c;} public void enjoy() { System.out.println("喵喵喵............"); } } class Dog extends Animal { private String furColor; Dog(String n,String c) {super(n); furColor = c; } public void enjoy() { System.out.println("汪汪汪............"); } } class Bird extends Animal { Bird() { super("bird"); } public void enjoy() { System.out.println("叽叽喳喳.........."); } } class Lady { private String name; private Animal pet; //定义Animal类型的pet Lady(String name,Animal pet) { this.name = name; this.pet = pet; } public void myPetEnjoy() {pet.enjoy();} } public class Test { public static void main(String args[]) { Animal a = new Animal("dongwu"); Cat c = new Cat("catname","blue"); Dog d = new Dog("dogname","black"); Bird b = new Bird(); Lady l1 = new Lady("l1",c); Lady l2 = new Lady("l2",d); Lady l3 = new Lady("l3",b); Lady l4 = new Lady("l4",a); l1.myPetEnjoy(); l2.myPetEnjoy(); l3.myPetEnjoy(); l4.myPetEnjoy(); } }
内存分析图
而向下转型可以弥补不能使用子类的功能的缺点