动态绑定和多态性
多态分为:
编译时多态:方法重载。
运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态(即,动态绑定)。
一般我们指的多态就是运行时多态。
eg.
public class TestPolymorphism {
public static void main(String[] args) {
// TODO Auto-generated method stub
Cat c = new Cat("catname", "yellow");
Dog d = new Dog("dogname", "black");
Lady l1 = new Lady("l1", c);
Lady l2 = new Lady("l2", d);
l1.myPetEnjoy();
l2.myPetEnjoy();
}
// TODO Auto-generated method stub
Cat c = new Cat("catname", "yellow");
Dog d = new Dog("dogname", "black");
Lady l1 = new Lady("l1", c);
Lady l2 = new Lady("l2", d);
l1.myPetEnjoy();
l2.myPetEnjoy();
}
}
class Animal
{
private String name;
Animal(String name) {this.name = name;}
public void enjoy() {System.out.println("叫声。。。。。。"); }
}
{
private String name;
Animal(String name) {this.name = name;}
public void enjoy() {System.out.println("叫声。。。。。。"); }
}
class Cat extends Animal
{
private String eyeColor;
Cat(String n, String c) {super(n); eyeColor = c; }
public void enjoy() {System.out.println("猫叫声。。。。。。"); }
}
{
private String eyeColor;
Cat(String n, String c) {super(n); eyeColor = 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("狗叫声。。。。。。"); }
}
{
private String furColor;
Dog(String n, String c) {super(n); furColor = c; }
public void enjoy() {System.out.println("狗叫声。。。。。。"); }
}
class Lady
{
private String name;
private Animal pet;
Lady(String name, Animal pet)
{
this.name = name;
this.pet = pet;
}
public void myPetEnjoy() {pet.enjoy(); }
}
{
private String name;
private Animal pet;
Lady(String name, Animal pet)
{
this.name = name;
this.pet = pet;
}
public void myPetEnjoy() {pet.enjoy(); }
}
结果:
猫叫声。。。。。。
狗叫声。。。。。。
讲真,l1.myPetEnjoy();l2.myPetEnjoy();这两个方法是调用了pet.enjoy(),但是enjoy()这个方法被多次重载,这样就会傻傻分不清,到底是调用谁的enjoy()方法,这时,动态绑定的作用就体现出来了,动态绑定是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。因此会出现如上结果。
通过上面的代码及分析,我们可以看出实现动态绑定需要以下三个必要条件:
一、要有继承(包括接口的实现);
二、要有重写;
三、父类引用指向子类对象。
二、要有重写;
三、父类引用指向子类对象。