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();            //传递的是Cat型的c,但这个pet不是Animal类型的吗?又没有强制转换为什么输入的是"猫叫声"呢,而不是"叫声"呢,父类引用不是不可以访问子类的变量和方法吗?
    }
}public class Test {
    public static void main(String args[]){
        Cat c = new Cat("catname","blue");
        Lady l1 = new Lady("l1",c);
       l1.myPetEnjoy();
    }
}

解决方案 »

  1.   

    补充:为什么把Cat里的enjoy方法换个方法名,就输出"叫声"呢
      

  2.   

    很惊讶!!
    首先:怎么可能Cat 和 Animal都是抽象类?
          然后下面又对抽象类进行初始化,
          你在编译器下面如果可以RUN到这个结果我就真的是无语了:(
      

  3.   

    1.首先如果你想把Animal Cat写成abstract ,那你类里面得抽象方法就不能用enjoy这个名字,因为你已经写了一个enjoy的实例方法,不能同名。例如你可以将那个实例方法改成enjoy1。2.你是传入的一个Cat的对象,所以调用的enjoy方法肯定是子类的,当你改变了Cat里enjoy方法的名字后,输出的是“叫声”,那是因为你调用了父类的enjoy方法。子类可以调用父类的方法。但父类不能调用子类的。