Почему не могу вызвать метод с класса в другой

Почему не могу вызвать метод с класса Veterinarian в Main подскажите пожалуйста

package animal;

public class Main  {

    public static void main(String[] args) {
        Animal dog  = new Dog("Barry", "Allabai",3,"Meat","Ukraine 1");
        Animal cat = new Cat("Murzik","Persian cat", 2,"Corm","Ukraine 2");
        Animal horse = new Horse("Shalun","Arabian", 120,"Ovos","Ukraine 3");
        Animal[] animals = {dog, cat, horse};
        for (Animal animal:animals) {
            System.out.println(animal.threatAnimal(animals));
        }
    }

}

и класс ветеринар

package animal;

public class Veterinarian {
  public  void threatAnimal(Animal animal) {
        System.out.println(animal.getFood() + animal.getLocation());
    }
}

Ответы (1 шт):

Автор решения: Михаил Ребров

Во-первых:
threatAnimal находится в другом классе.

Во-вторых:
метод main() статический, а метод threatAnimal(), который вы хотите вызвать нет.

Как разрешить ситуацию

способ №1

Ничего не меняете в ветеринаре, а просто создаете один объект ветеринара, на котором вы уже сможете вызывать данный метод

public class Main  {

    public static void main(String[] args) {
        // создаем объект ветеринара
        Veterinarian veterinarian =  new Veterinarian();

        Animal dog  = new Dog("Barry", "Allabai",3,"Meat","Ukraine 1");
        Animal cat = new Cat("Murzik","Persian cat", 2,"Corm","Ukraine 2");
        Animal horse = new Horse("Shalun","Arabian", 120,"Ovos","Ukraine 3");
        Animal[] animals = {dog, cat, horse};
        for (Animal animal:animals) {
            // вызываем метод
            veterinarian.threatAnimal(animal);
        }
    }
}

способ №2

Объявляем метод threatAnimal() статическим

package animal;

public class Veterinarian {
  // добавили ключевое слово static
  public static void threatAnimal(Animal animal) {
        System.out.println(animal.getFood() + animal.getLocation());
    }
}

в данном случае объект ветеринара можно не создавать (хотя с точки зрения БЛ это странно)

public class Main  {
    public static void main(String[] args) {
        Animal dog  = new Dog("Barry", "Allabai",3,"Meat","Ukraine 1");
        Animal cat = new Cat("Murzik","Persian cat", 2,"Corm","Ukraine 2");
        Animal horse = new Horse("Shalun","Arabian", 120,"Ovos","Ukraine 3");
        Animal[] animals = {dog, cat, horse};
        for (Animal animal:animals) {
            // вызываем метод указывая при этом имя класса в котором он находится
            Veterinarian.threatAnimal(animal);
        }
    }
}

способ №3

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

public class Main  {
    public static void main(String[] args) {
        Animal dog  = new Dog("Barry", "Allabai",3,"Meat","Ukraine 1");
        Animal cat = new Cat("Murzik","Persian cat", 2,"Corm","Ukraine 2");
        Animal horse = new Horse("Shalun","Arabian", 120,"Ovos","Ukraine 3");
        Animal[] animals = {dog, cat, horse};
        for (Animal animal:animals) {
            // вызываем метод
            threatAnimal(animal);
        }
    }

    // добавили ключевое слово static
    public static void threatAnimal(Animal animal) {
        System.out.println(animal.getFood() + animal.getLocation());
    }
}

Замечание:
Я привел 3 способа преодолеть технические ограничения и вызвать нужный вам метод, но с точки зрения ООП и бизнес логики приложения предпочтительнее использовать первый способ.

→ Ссылка