`

动态绑定

    博客分类:
  • JAVA
 
阅读更多
动态绑定/多态:

动态绑定是指在执行期间(而非编译期间)判断所引用对象的实际类型,


上面例子中,根据Lady对象的成员变量pet所引用的不同的实际类型而调用相应的enjoy方法

  class Animal {
  private String name;
  Animal(String name) {this.name = name;}
 
  public void enjoy(){
    System.out.println("叫声......");
  }
 
  }

  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;
    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[]){
        Cat c = new Cat("catname","blue");
        Dog d = new Dog("dogname","black");
        Bird b = new Bird();
        Lady l1 = new Lady("l1",c); //c 实际上new 的是 cat就调用cat的enjoy方法,而不是父类pet的enjoy方法,这就是动态绑定。
        Lady l2 = new Lady("l2",d);
        Lady l3 = new Lady("l3",b);
        l1.myPetEnjoy();
        l2.myPetEnjoy();
        l3.myPetEnjoy();
    }
}


运行结果:
猫叫声......
狗叫声......
鸟叫声......

动态绑定/多态的 三个必要条件:

1.要有继承
2.要有重写
3.父类引用要指向子类对象(向上造型)

当你调用父类中被重写的方法的时候,例如例题中的pet.enjoy()方法,实际当中new的是哪个子类对象,就调用哪个子类的方法。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics