多态和动态绑定

时间:2021-09-01 16:18:53

父类Animal:

class Animal{
private String name;
Animal(String name){
this.name=name;
}

public void enjoy(){
System.out.println("叫声。。。");
}
}
子类Cat:extends关键字

class Cat extends Animal{
private String eyesColor;
Cat(String n,String c){
super(n);eyesColor=c;
}

public void enjoy(){
System.out.println("喵~"); //重写父类Animal中的enjoy方法
}
}
Lady类,人可以养动物:

class Lady{
private String name;
private Animal pet;

Lady(String name,Animal pet){
this.name=name; this.pet=pet;
}

public void myPetEnjoy(){pet.enjoy();} //动态绑定机制,Lady方法中传进的pet是什么就调谁的enjoy方法
}
main函数:

public class TestAnimal{
public static void main(String args[]){
Cat c=new Cat("catname","blue");
Lady l1=new Lady("l1",c); //动态绑定机制
l1.myPetEnjoy();
}
}

Lady l1=new Lady("l1",c); 传入的是c (Cat c=new Cat("catname","blue"))是Cat类型的,所以enjoy方法的指针在执行到这句话时,自动指向Cat的enjoy方法,即动态绑定

多态和动态绑定

多态三要素:要有继承;要有重写;父类引用指向子类对象

在此例子中,假如要加入另一种动物狗,另一个人l2养了一只宠物狗,l2的狗高兴的叫了

只需要添加Dog类:

class Dog extends Animal{
private String furColor;
Dog(String n,String c){super(n);furColor=c;}

public void enjoy(){
System.out.println("汪汪汪~");
}
}
适当修改客户端

     Dog d=new Dog("dahuang","yellow");
Lady l2=new Lady("l2",d);
l2.myPetEnjoy();
   可见,我们并没有手动修改,在执行Lady l2=new Lady("l2",d);这句话时,自动就找到Dog类中的enjoy方法了。这样一来添加动物也不需修改其他类,更灵活。


下一篇写抽象类和接口