我有这个例子:
public class Inheritance {
public static class Animal {
public void Scream() {
System.out.println("I'm an animal");
}
}
public static class Mammal extends Animal{
public void Scream(){
System.out.println("I'm a mammal");
}
}
public static class Tiger extends Mammal{
public void Scream(){
System.out.println("I'm a tiger");
}
}
public static void main (String[] args){
Animal tiger = new Tiger();
tiger.Scream();
}
}
当然,我会收到:“我是老虎”。但是,我不知道如何打印“我是哺乳动物”或“我是动物”
@:请为我回答子问题:如果是Tiger
类,什么是Tiger
的超类。 Mammal
或Animal
?
请帮帮我:)。
谢谢::)
答案 0 :(得分:3)
以下是代码示例:
public class Inheritance {
public static class Animal {
public void Scream() {
System.out.println("I'm an animal");
}
}
public static class Mammal extends Animal{
public void Scream(){
super.Scream();
System.out.println("I'm a mammal");
}
}
public static class Tiger extends Mammal{
public void Scream(){
super.Scream();
System.out.println("I'm a tiger");
}
}
public static void main (String[] args){
Animal tiger = new Tiger();
tiger.Scream();
}
}
答案 1 :(得分:1)
在方法重写中,java将始终检查在运行时创建了哪个对象。如果你想打印“我是哺乳动物”:
Animal m = new Mammal();
m.Scream();
这将打印“我是一个哺乳动物”。
如果你想打印“我是动物”:
Animal a = new Animal();
a.Scream();
答案 2 :(得分:0)
Java不像c ++那样可能。
您可以在每个scream方法中调用super.scream(),但它会同时显示:
“我是哺乳动物”和“我是动物”。
我不确定你为什么要那样做。
答案 3 :(得分:0)
要打印“我是哺乳动物”,你应该成为哺乳动物类的对象。
public static void main (String[] args){
Animal mammal = new Mammal();
mammal.Scream();
}
要打印“我是动物”,你应该制作一个动物类的对象。
public static void main (String[] args){
Animal animal = new Animal();
animal.Scream();
}
注意:在上述两种情况下,参考变量仍为Animal。
答案 4 :(得分:0)
1)正如其他人已经说过的那样,如果你想从超类中调用被覆盖的方法,请调用super.Scream()
。您将获得以下输出:
I'm an animal
I'm a mammal
I'm a tiger
2)Tiger实现了Mammal,所以Mammal是Tiger的超类,而且由于Animal是Mammal的超类,Tiger也实现了Animal。换句话说:老虎的超级班级是老虎和动物。
// all of this is valid:
Tiger tiger = new Tiger();
Mammal mammal = tiger;
Animal animal = tiger;
如果您致电animal.Scream()
,则虚拟机知道anmial
的类型为Tiger,并调用Tiger类中声明的尖叫方法。请参阅Polymorphism。