Java OOP:子类 - 对象如何使用超类中的方法(该方法已被覆盖)

时间:2012-03-23 10:32:57

标签: java oop inheritance

我有这个例子:

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的超类。 MammalAnimal

请帮帮我:)。

谢谢::)

5 个答案:

答案 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