His*_*eer 42 java inheritance overriding
如何使用代码中Animal
的myAnimal
实例调用类的eat and drink方法?
public class Animal {
public void eat() {
System.out.println("Animal Eats");
}
public void drink() {
System.out.println("Animal Drinks");
}
}
Run Code Online (Sandbox Code Playgroud)
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("Cat Eats");
}
@Override
public void drink() {
System.out.println("Cat Drinks");
}
public static void main(String[] args) {
Cat myCat = new Cat();
myCat.eat();
myCat.drink();
Animal myAnimal = myCat;
myAnimal.eat();
myAnimal.drink();
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出:
Cat Eats
Cat Drinks
Cat Eats
Cat Drinks
Run Code Online (Sandbox Code Playgroud)
这是我的预期输出:
Cat Eats
Cat Drinks
Animal Eats
Animal Drinks
Run Code Online (Sandbox Code Playgroud)
Tof*_*eer 65
你无法做你想做的事.多态性的工作方式是做你所看到的.
基本上猫总是知道它是一只猫,并且总是表现得像一只猫,不管你是否像猫,猫科动物,猫科动物,猫科动物,猫科动物,食肉目,Theria,Mammalia,Vertebrata,Chordata,Eumetazoa,Animalia,动物,对象或其他任何东西:-)
And*_*rma 19
在这里,您可以选择要调用的方法:
public class Cat extends Animal {
public void superEat() {
super.eat();
}
public void superDrink() {
super.drink();
}
@Override
public void eat() {
System.out.println("Cat Eats");
}
@Override
public void drink() {
System.out.println("Cat Drinks");
}
}
Run Code Online (Sandbox Code Playgroud)
这一行:
Animal myAnimal = myCat;
将变量分配给您之前创建myAnimal
的对象myCat
.因此,当您myAnimal.eat()
在此之后调用时,您实际上正在调用原始myCat对象的方法,该方法将输出Cat Eats
.
如果要输出Animal Eats
,则必须为Animal
变量分配实例.所以,如果你这样做:
Animal myAnimal = new Animal()
变量myAnimal将是一个实例Animal
,因此将覆盖之前的赋值Cat
.
如果你myAnimal.eat()
在此之后调用,你实际上是在调用你创建eat()
的Animal
实例的方法,它将输出Animal Eats
.
总结:您的代码应为:
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("Cat Eats");
}
@Override
public void drink() {
System.out.println("Cat Drinks");
}
public static void main(String[] args) {
Cat myCat = new Cat();
myCat.eat();
myCat.drink();
Animal myAnimal = new Animal();
myAnimal.eat();
myAnimal.drink();
}
}
Run Code Online (Sandbox Code Playgroud)