因为我是Java和OOP的新手,所以我很在意。可以说我有一个类Animal
,和Dog
,Frog
,Cat
的子类扩展动物。 Animal
及其所有子类都有一个move()
方法。子类中的move()
除了使用自己的代码外,还使用super.move()
。我的Main
类有一个变量currentAnimal
,它基本上持有房间中当前动物的实例,因此一次只能存在1只动物(可以是Dog,Frog或Cat类)。Java创建子类的变量 - 多态性不起作用
我初始化currentAnimal为Animal currentAnimal = null
(使它Animal
类可能是错误的,因为它永远不会Animal
类,而是一些子动物类(青蛙,狗,猫),但我没有看到一个更好的选择,类型Object
而不是Animal
似乎不起作用)。程序运行时,它接受来自用户的命令,例如,如果命令是"new Dog"
,它会执行以下操作Main.currentAnimal = new Dog()
。
然后,我希望用户能够调用将执行move()
当前存储在currentAnimal
中的对象的“移动”命令。并且问题发生在这里,因为编译器认为currentAnimal是Animal类的实例,它告诉我Animal
类有move()
方法,但具有不同的签名并且不能编译。但我不希望它调用Animal.move()
,而是我希望它调用currentAnimal
中当前对象的move()
(例如,如果对象是Dog类,则它将使用Dog.move()
而不是Animal.move()
)。如果我知道当前动物当前正在存储哪个动物,我会使用cast,但是我不知道,我只知道currentAnimal中的动物具有move()
方法,我想称之为。我怎么做?
主类:
public class Main {
static Animal currentAnimal = null;
public static void main(String[] args) {
currentAnimal = new Dog(2,3);
currentAnimal.move("asd");
}
}
Animal类:
public class Animal {
public void move(String s1, String s2){
System.out.println("animal.move - parameters: " + s1 + " " + s2);
}
}
Dog类:
public class Dog extends Animal {
int h;
int w;
public Dog(int h, int w){
this.h = h;
this.w = w;
}
public void move(String s){
super.move("s1", "s2");
System.out.println("dog.move - parameters: " + s);
}
}
它结束了运行Animal.move()而不是Dog.move() 。我不能用新的Dog()声明一个变量,因为它的变化取决于用户在执行过程中给出的命令。
Animal animal = new Dog();
animal.move();
它将从Dog
类执行,因为java polymorphism principle的move()
方法:每当有没有动物,如果你声明这样的变量currentAnimal为空
请张贴代码 – baao
格式化您的文章。单片帖子往往被忽略。使用段落,将您的解释/示例捆绑在一起。就像你向忙碌的人解释问题一样,保持简洁。 –
您将会看到Java已经通过多态性为您完成了这项工作。 –