2015-10-10 4 views
5

Я думаю, что я начинаю понимать эту тему, но не полностью. Может кто-нибудь объяснить мне, на этом примере:Полиморфизм на простом примере

public class Solution 
{ 
    public static void main(String[] args) 
    { 
     Cow cow = new Whale(); 

     System.out.println(cow.getName()); 
    } 

    public static class Cow 
    { 
     public String getName() 
     { 
      return "Im cow"; 
     } 
    } 

    public static class Whale extends Cow 
    { 
     public String getName() { 
      return "Im whale"; 
     } 
    } 
} 

какая разница, когда называют это:

Cow cow = new Whale(); 
System.out.println(cow.getName()); 

и это:

Whale whale = new Whale(); 

System.out.println (кит. GetName());

У меня будет такой же вывод, но в каких случаях или, может быть, когда мы должны будем называть методы класса Cow и при создании класса Whale. Извините, если я дал слишком глупый или слишком простой пример. Надеюсь, ты избавишься от того, что я хотел сказать. Спасибо заранее.

ответ

3

Это хороший вопрос для понять Полиморфизм. Я не уверен, что Кит должен распространяется корова;), но я могу показать вам немного различной структуры:

public class Solution { 
    public static void main(String[] args) { 
     Animal animal1 = new Cow(); 
     Animal animal2 = new Whale(); 

     ArrayList<Animal> myAnimals = new ArrayList<Animal>(); 
     myAnimals.add(animal1); 
     myAnimals.add(animal2); 
     //show all my animals 
     for (Animal animal : arrayList) { 
      System.out.println(animal.getName()); 

     } 


    } 


    public static class Animal { 
     public String getName() { 
      return "Im general animal"; 
     } 
    } 

    public static class Cow extends Animal { 
     public String getName() { 
      return "Im cow"; 
     } 
    } 

    public static class Whale extends Animal { 
     public String getName() { 
      return "Im whale"; 
     } 
    } 
} 

В приведенном выше примере я создал класс животных, который продолженную коровы и кита. Я могу создать список своих животных и отобразить их имена. В вашем примере нет разницы, чтобы сделать объект для Cow cow = new Whale(); и китовый кит = новый кит(); Вам это понятно?

+0

джипа. теперь его более ясно. очень хороший пример в сравнении с моим. спасибо – TyLeR

1

При использовании файла Cow cow = new Whale() объект создается подобно Whale, но имеет доступ только к Cow методам.

Например, если вы добавляете в свой Whale класс метод:

public int getDeepestDive() { 
    // some code 
} 

Этот код будет работать:

Whale whale = new Whale(); 
System.out.println(whale.getDeepestDive()); 

Этот код покажет вам, что Cow не имеет метод, называемый getDeepestDive():

Cow whale = new Whale(); 
System.out.println(whale.getDeepestDive()); 
1

В вашем примере вы указали экземпляр Whale на номер Cow. Однако объект все еще является Whale. Вот почему вы получаете тот же результат. Теперь рассмотрим этот Whale класс:

public static class Whale extends Cow { 
    public String getName() { 
    return "Im whale"; 
    } 
    public void submerge() { 
    System.out.println("Hunting submarines"); 
    } 
} 

Переопределение метода всегда будет вызывать метод по типу объекта, который конкретизируется, если не принуждал явно сделать иначе (с броском). Однако эта новая реализация Whale имеет новый метод, который не определен на Cow. Таким образом, вы можете позвонить:

Whale whale = new Whale(); 
whale.submerge(); 

Но вы не можете писать:

Cow mascaradedWhale = new Whale(); 
mascaradedWhale.submerge(); 

Во втором примере вы получите ошибку компиляции при вызове метода, так как этот метод не определен в классе Cow.

1

Или, может быть, разница станет более понятным, если нужно создать метод, который обрабатывает коров, скажем, тот, который собирает имена всех коров, китов, собак, лошадей и т.д.

Этот метод не требует знать о китах или любом другом подклассе коровы. Тем не менее он должен работать. Пример:

public static List<String> collectNames(List<Cow> cows) 
{ 
     return cows.stream().map(c -> c.getName()).collect(Collectors.toList()); 
} 

И я не уверен, почему кит расширяет корову. Если это так, мы должны увидеть его на канале NG. Более правильный пример может быть:

животных -> Корова, собака, кошка, Кит

Person -> Студент, Водитель, разработчик и т.д.

+0

Я просто хотел сделать кита у коровы)). плохо напишите электронное письмо в NG, как только оно выйдет по телевизору, плохо узнайте))) – TyLeR

Смежные вопросы