Java OOP: как объект подкласса использует метод из суперкласса (этот метод был Override) - PullRequest
3 голосов
/ 23 марта 2012

У меня есть этот пример:

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?

Пожалуйста, помогите мне:)

Спасибо ::)

Ответы [ 5 ]

3 голосов
/ 23 марта 2012

Вот пример кода:

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 голос
/ 23 марта 2012

В переопределении метода java всегда будет проверять, чей объект был создан во время выполнения.Если вы хотите печатать «Я млекопитающее»:

Animal m = new Mammal();
m.Scream();

, то будет напечатано «Я млекопитающее».

И если вы хотите печатать «Я млекопитающее»животное ":

Animal a = new Animal();
a.Scream();
0 голосов
/ 23 марта 2012

1) Как уже говорили другие парни, вызовите super.Scream(), если вы хотите вызвать переопределенный метод из суперкласса.Вы получите следующий вывод:

I'm an animal
I'm a mammal
I'm a tiger

2) Tiger реализует Mammal, поэтому Mammal является суперклассом Tiger, а так как Animal является суперклассом Mammal, Tiger также реализует Animal.Другими словами: суперклассами Tiger являются Tiger и Animal.

// all of this is valid:
Tiger tiger = new Tiger();
Mammal mammal = tiger;
Animal animal = tiger;

Если вы вызываете animal.Scream(), виртуальная машина знает, что anmial имеет тип Tiger и вызывает метод scream, объявленный в классе Tiger.См Полиморфизм .

0 голосов
/ 23 марта 2012

Чтобы напечатать "Я млекопитающее", вы должны сделать объект класса Млекопитающих.

 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.

0 голосов
/ 23 марта 2012

Java не похож на c ++, где это возможно.

Вы можете вызывать super.scream () в каждом методе scream, но он будет отображать оба:

«Я млекопитающее» и «Я животное».

Я не уверен, почему вы захотите это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...