动态绑定是指在“执行期间”,而非在编译期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
如下例子中,根据 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();
}
}
内存分析图
而向下转型可以弥补不能使用子类的功能的缺点