声明:代码和图片是本人在学习期间复制尚学堂课件中的资料,对其做一下总结。

 

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 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);

        Lady l2 = new Lady("l2",d);

        Lady l3 = new Lady("l3",b);

       //l1.myPetEnjoy();

        l2.myPetEnjoy();

        l3.myPetEnjoy();

    }

}

wKioL1PoiMKD3f6CAAEZkp3cSDw888.jpg

---------------------------------------------------------------
运行结果:猫叫声。。
                  狗叫声。。

---------------------------------------------------------------