1、动态绑定:执行期间(而非编译期间)判断所引用对象的实际类型,根据实际的类型调用相应方法。
2、多态存在的三个必要条件(同时):继承、重写、父类引用指向子类对象。
这三个条件满足后,当调用父类中被重写的方法时,实际new的是哪个子类对象,就调用该子类的方法。
例子:
public class TestAnimal{ public static void main(String args[]){ Dog d=new Dog("dogname","black"); Cat c=new Cat("catname","blue"); Lady l1=new Lady("l1",c); Lady l2=new Lady("l2",d); l1.myPetEnjoy();//猫叫声。。。 l2.myPetEnjoy();//狗叫声。。。 } } class Lady{ String name; Animal pet; Lady(String name,Animal pet){ this.name=name; this.pet=pet; } void myPetEnjoy(){ pet.enjoy(); } } class Animal{ public String name; Animal(String name){ this.name=name; } void enjoy(){ System.out.println("叫声。。。"); } } class Dog extends Animal{ public String furColor; Dog(String name,String furColor){ super(name); this.furColor=furColor; } void enjoy(){ System.out.println("狗叫声。。。"); } } class Cat extends Animal{ public String eyesColor; Cat(String name,String eyesColor){ super(name); this.eyesColor=eyesColor; } void enjoy(){ System.out.println("猫叫声。。。"); } }
显然,Animal类型的引用pet指向Cat类型的对象,这时不能访问eyesColor。但对于方法的调用,是根据实际对象的类型,这是动态实现的。(指向方法的指针是动态指向的)这样可扩展性达到最佳。(相关题目见本博客【转】深入理解Java多态性)一个主意的应用就是在游戏设计中,基类有drawMyself()方法,子类均从中继承并重写该方法,方便扩展。
内存分析: