2015-07-28 4 views
1

Я недавно изучаю java, я пришел из PHP-фона. Я придерживаюсь концепции, которую я не совсем понял, поэтому у меня есть родительский класс, называемый (Animal) и дочерний класс (Wolf), из того, что я знаю, когда вы хотите создать новый экземпляр класс (Wolf), например, это код, который вы пишете:Стимуляция класса с использованием суперкласса и интерфейса

Wolf wolf1 = new Wolf(); 

Но в книгах я нашел этот второй путь, который также получить вам те же результаты:

Animal wolf1 = new Wolf(); 

вторая вещь, когда ты иметь интерфейс (назовем его (myInterface)), и класс (Wolf) реализует его, я нашел третий способ создания класса (Wolf):

myInterface wolf1 = new Wolf(); 

Вопросы: Почему это работает? и зачем это делать в первую очередь? есть ли простой пример, который дает понять, почему вы должны управлять своим классом с помощью второго и третьего способов?

+1

Возможный дубликат [Что означает «программировать интерфейс»?] (http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface) – Tom

+0

«Волк» - это «Животное» (в качестве подкласса «Животное»), поэтому первый работает. Второй подобен, когда 'Wolf' реализует и интерфейс,' Wolf' становится также этим интерфейсом 'myInterface'. – innoSPG

ответ

3

Это преимущество объектно-ориентированного программирования. Если у вас есть Animal класс и Cat что extends Animal, Dog что extends Animal, то вы можете написать код, который меньше дублировали:

public void beAnnoying(Animal animal) { 
    animal.makeSound(); 
} 

Насколько почему это работает? В реальной жизни вы можете использовать отношения «Is-A» для наследования. Собака «Is-A» Animal, а также кошка «Is-A» Animal. Поэтому, если все участники могут сделать звук, то почему вы не можете сделать метод, который вызывает это в целом?

Редактировать: Потому что я не могу ответить в комментарии, я отвечу здесь. Что, если вы хотите сказать Wolf wolf = new Wolf();, тогда назначьте эту собаку позже? Вы не можете с этим (вам придется создать другую переменную), но если у вас было Animal Wolf = new Wolf();, тогда wolf = new Dog(); это прекрасно работает. Я уверен, что есть другие причины, по которым я просто не уверен.

+0

Из примера, который вы дали, я могу четко понять, почему вы дали (животное) тип данных (Animal), поэтому вы можете передать все объекты, полученные из класса (Animal), используя полиморфизм. но когда вы просто хотите ввести в действие класс (Волк), зачем нужно делать это с помощью (Animal) и (myInterface) нотации? вот что я не могу опустить. –

+0

Если вам не нужен полиморфизм, просто не используйте его :) –

1

Как уже говорилось, вы описываете полиморфизм. Идея состоит в том, что один родительский класс может использоваться для описания множества разных подклассов. У вас уже есть родительский класс Animal и подкласс Wolf. Давайте также скажем, что вы хотите создать подкласс Dog. Собака также является животным, поэтому любые функции (методы в Java) или переменные (поля в Java), найденные в Animal, могут использоваться в Dog. Так что если у вас есть способ съесть в классе животных,

public void eat() 
{ 
    hunger_counter++; 
} 

вы можете вызвать этот метод в классе собак без ошибок.

dog.eat(); 

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

Animal[] animals = new Animal[4]; 

Мы хотим, чтобы первое животное было Волком, а остальные - собакой. Вместо того, чтобы иметь один массив объектов Wolf и другой массив объектов Dog, мы можем напрямую использовать наш массив Animals [].

animals[0] = new Wolf(); 
animals[1] = new Dog(); 
animals[2] = new Dog(); 
animals[3] = new Dog(); 

Они все типа животных, но они также имеют дополнительные поля и методы, найденные в пределах классов Wolf/Dog.

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