JavaSE—10.动态绑定和多态

动态绑定和多态

  • 动态绑定是指在执行期间(而非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
class Animal {
    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("猫叫声");
    }
}
class Dog extends Animal {
    private String furColor;
    Dog(String n, String f){
        super(n);
        furColor = f;
    }
    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");
        Lady l1 = new Lady("11", c);
        Lady l2 = new Lady("12", d);
        l1.myPetEnjoy();
        l2.myPetEnjoy();
    }
}

​ 执行Cat c = new Cat("catname", "blue");后,c指向堆内存中的Cat对象,Cat对象中包含了其父类对象Animal,执行Lady l1 = new Lady("11", c);后,将c作为参数传递给了l1,所以堆内存中的Lady对象中的Animal属性指向了堆内存中的Cat对象。

​ 当调用enjoy方法的时候,实际当中new的什么类型,就调用谁的方法,而不是通过引用类型来确定。实际上在具体类型的对象中(Cat、Dog)有一个方法的指针,在没有确定其子类之前,指针指向的是父类的方法,当new了新的对象之后,指针随之改变,指向该对象重写的这个方法 。

在这里插入图片描述

多态存在的三个必要条件

  1. 要有继承
  2. 要有重写
  3. 父类引用指向子类对象

猜你喜欢

转载自blog.csdn.net/qq_32661327/article/details/83218648