动态绑定也叫多态,也叫池绑定,用它的目的是为了提高方法的扩展性,具体怎么用大家可以看下面的代码中的例子。
核心思想
动态绑定是指在执行期间,而非编译期间判断所引用对象的实际类型,根据其实际类型调用其方法。
abstract class Animal {
private String name;
Animal(String name) {this.name = name;}
/*
public void enjoy(){
System.out.println("叫声......");
}
*/
public abstract void enjoy();
}
abstract class Cat extends Animal {
private String eyesColor;
Cat(String n,String c) {super(n); eyesColor = c;}
/*
public void enjoy() {
System.out.println("猫叫声......");
}
*/
//public abstract void enjoy();
}
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");
Lady l1 = new Lady("l1",c);
l1.myPetEnjoy();
}
}
内存动态分配图:
这张图里面先new出来了一只猫,这只猫继承了animal抽象类,通过初始化给猫起了名字,并且给赋给了猫一个蓝色的眼睛,然后new出来了一个lady,她有名字L1,通过初始化lady把lady的pet指向了我们开始生成的的猫(this.pet=pet做到的),它只能指向猫的父类annimal这个类,此时l1指向了右面的方框,开始调方法了,方法作为一块儿单独的区域放到code seg块中,现在有两个enjoy的方法都在里面放着,一个是父类的,一个是子类的,如果按照引用类型来确定,我们会去调父类的那个方法,如果按照实际类型,也就是new出来的类型来确定的话,我们会去调子类的方法;动态绑定机制就是按照第二种,new出来的类型来确定,更深的机制是在catname这个对象中还有一个enjoy方法指针 ,你new什么对象,他就会去找哪个对象所对应的方法。
总结:
1.既然叫动态绑定,那就说明在动的时候他会产生效果,这就是我们需要记住的。
2.从内存了解了猫叫声是怎么叫出来的,这声音才会听得很舒服。