因爲我是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已經通過多態性爲您完成了這項工作。 –