JAVA笔记9-多态(动态绑定、池绑定)

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()方法,子类均从中继承并重写该方法,方便扩展。

  内存分析:

posted @ 2014-04-10 14:52  seven7seven  阅读(270)  评论(0编辑  收藏  举报