我正在通过Java多态性练习,努力理解类型转换以及如何调用特定于子类的方法。我有一班狗:
public class Dog
{
private final String breed;
public Dog(String b)
{
breed = b;
}
//More Dog methods (bark, eat, etc.)
}
以及可以拉雪橇的子类SledDog:
public class SledDog extends Dog
{
public SledDog(String b)
{
super(b);
}
public void pullSled()
{
System.out.println("pulling the sled");
}
}
在我的申请中,我声明了3只狗-两只普通狗和一只SledDog。我将它们传递到Dogs数组中,然后遍历该数组。如果这只狗是雪橇犬,我希望他去pullSled()-但我不知道如何调用该方法,因为它属于子类。我的指令告诉我将数组项转换为SledDog对象,但是我不知道该怎么做或为什么要这样做。我以为,由于传递给数组的对象已经是SledDog,因此它应该可以访问pullSled()。这是我的尝试。
public class DogApp
{
public static void main(String[] args)
{
Dog firstDog = new Dog("Greyhound");
Dog secondDog = new Dog("Terrier");
SledDog sledDog = new SledDog("Husky");
Dog[] dogArray = new Dog[]{firstDog, secondDog, sledDog};
for(Dog d : dogArray)
{
//Makes sense, only want to pullSled() if d is a SledDog
if(d instanceof SledDog)
{
// This is the part I'm confused about
d = (SledDog) d;
d.pullSled();
}
}
}
}
最佳答案
您非常接近,只需对其进行强制转换并调用该方法:
((SledDog)d).pullSled();
在
if (d instance of SledDog)
条件内。另外,我看不到
dogArray
的声明。确保正确声明并初始化了它。