多态参数适用于超类,但不适用于子类

时间:2017-08-21 11:12:18

标签: java inheritance

我只是在学习多态,所以对我来说很容易(从书中复制)。我尝试将一个类作为参数传递给方法。当我这样做时,我可以调用超类方法,但不能调用实际的子类。使用start()方法,我试着让狼嚎叫:

 public class experiment {
    public static void main(String[] args) {
        PetOwner own = new PetOwner();
        own.start();

    }
}

//Trying polymorphic arguments
class Vet {
    public void giveShot(Animal a) {
        a.howl();
    }
}
class PetOwner {
    public void start() {
        Vet v = new Vet();
        Wolf w = new Wolf();

        v.giveShot(w);
    }
}
//Inheritance//
//Kingdom - Animal
class Animal {
    public void move() {
        System.out.println("*motions softly*");
    }
}
//Family - canine
class Canine extends Animal {
    public void bark() {
        System.out.println("Woof!");
    }
}
//Species - wolf
class Wolf extends Canine {
    public void howl() {
        System.out.println("Howl! Howl!");
    }
}

如果我将howl方法传递给超类(Animal),它可以正常工作。如果我直接从Wolf类调用它 - 它工作正常。它不起作用的唯一例子是我试图将狼类作为参数传递并从那里调用它。

这就是我尝试这种方式的原因,引自Head First Java第187页:

  

兽医的giveShot()方法可以接受你给它的任何动物。只要   作为参数的对象是Animal的子类,它   会工作

我得到一个“找不到符号符号:方法嚎叫(),动物类型的位置变量”错误。

3 个答案:

答案 0 :(得分:2)

您正在调用a.howl()aAnimal类的实例。 Animal不知道如何howl。唯一的Wolf会。

您可以定义一个方法react(),然后为Animal的任何特定子类覆盖它;

答案 1 :(得分:0)

您正在调用giveShot-Method中的howl-Method。动物没有嚎叫方法。

编辑:如果你在giveShot-Method中将动物施放到狼身上,它应该有效。

答案 2 :(得分:0)

是的,你可以这样做:

class Vet {
    public void giveShot(Animal a) {
        a.makeNoise();
    }
}
class Animal {
    public void move() {
        System.out.println("*motions softly*");
    }
    public void makeNoise() {
    }
}
//Family - canine
class Canine extends Animal {
    @Override
    public void makeNoise() {
        System.out.println("Woof!");
    }
}
//Species - wolf
class Wolf extends Canine {
    @Override
    public void makeNoise() {
        System.out.println("Howl! Howl!");
    }
}