日期:2014-05-20  浏览次数:20751 次

*父类的引用可以访问子类的方法吗
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.首先如果你想把Animal Cat写成abstract ,那你类里面得抽象方法就不能用enjoy这个名字,因为你已经写了一个enjoy的实例方法,不能同名。例如你可以将那个实例方法改成enjoy1。

2.你是传入的一个Cat的对象,所以调用的enjoy方法肯定是子类的,当你改变了Cat里enjoy方法的名字后,输出的是“叫声”,那是因为你调用了父类的enjoy方法。

子类可以调用父类的方法。但父类不能调用子类的。