2017-01-17 17 views
1

Итак, я хочу создать массив полиморфных классов в Java. Это массив животных, и я хочу добавить в массив разных видов животных. Животное - это суперкласс, а разные виды животных - это подклассы, и мне нужно реализовать метод, который добавляет конкретное животное к массиву на основе атрибутов, но поскольку у всех видов животных разные атрибуты, я не знаю, как сделай это. У меня есть этот основной метод до сих пор, и она составляет:Возможно ли иметь переменные условия в методе Java?

public void addAnimal(String name, double weight) { 
     if ((numberanimals < animals.length) && (numberanimals == 0)) { 
      animals[0] = new Animal(name, weight); 
      numberanimals += 1; 
     } else if (numberanimals < animals.length) { 
      animals[numberanimals] = new Animal(name, weight); 
      numberanimals += 1; 
      } else { 
       System.out.println("Zoo is full."); 
      } 
} 

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

+1

Обычно вы можете создать животное первого и передать его в 'addAnimal (Animal а)' (например, 'addAnimal (новый жирафа ("Коротышка"))'). – molbdnilo

+1

Вы должны изменить метод на 'public void addAnimal (Животное животных)', и он сможет получать любой тип животных (классы, которые наследуются от Animal). Затем вы просто создаете животное перед вызовом метода. –

+0

Вы можете использовать абстрактный метод предикатов для суперкласса и переопределить его с различными условиями выбора в подклассах. –

ответ

3
  1. Каждый Crocodile является Animal.
  2. Animal имеет гарантийный доступ к Animal методам и общественным объектам.
  3. Вы можете проверить, если Animal является Crocodile использованием animal instanceOf Crocodile
  4. Если это Крокодил, вы можете бросить: Crocodile croco = (Crocodile)animal;.
  5. Вы можете добавить Crocodile в Animal[] или в List<Animal>, так как это Animal.
  6. Каждый объект является instanceOf Object, так как все классы расширяются Object.

Ваш метод должен быть:

public void addAnimal(Animal a){ 
    if ((numberanimals < animals.length) && (numberanimals == 0)) { 
     animals[0] = a; 
     numberanimals += 1; 
    } else if (numberanimals < animals.length) { 
     animals[numberanimals] = a; 
     numberanimals += 1; 
     } else { 
      System.out.println("Zoo is full."); 
     } 
    } 
} 

, а затем вы можете назвать его любым Animal - это Lion - addAnimal(new Lion(...)); и т.д.

2

Вы можете проверить точный класс экземпляра путем вызова ' экземпляр'. Например:

if(animals[i] instanceof Dog) { 
//do something 
} 
+0

Это помогло мне с другой задачей, но как я могу использовать атрибут собаки тогда. 'animals [i] .leash', например, не работает. – NoIdea

+1

, вы должны перенести его на собаку, так как класс Animal не имеет привязного свойства. '((Собака) животные [i]). Leash' вы должны убедиться, что это экземпляр класса Dog! – nikowis