Почему в задаче, если сравнивать типы в приведенном порядке, то Лев и Тигр имеют тип Кот. Если же в методе строку "o instanceof Cat" сделать после аналогичных строк для Льва и Тигра, то программа работает корректно. Это как то связано с вызовом конструкторов наследуемых классов?
public class Solution {
public static void main(String[] args) {
System.out.println(getObjectType(new Cat()));
System.out.println(getObjectType(new Tiger()));
System.out.println(getObjectType(new Lion()));
System.out.println(getObjectType(new Bull()));
System.out.println(getObjectType(new Cow()));
System.out.println(getObjectType(new Animal()));
}
public static String getObjectType(Object o) {
if (o instanceof Cat) return "Кот";
else if (o instanceof Tiger) return "Тигр";
else if (o instanceof Lion) return "Лев";
else if (o instanceof Bull) return "Бык";
else if (o instanceof Cow) return "Корова";
else return "Животное";
}
public static class Cat extends Animal{
}
public static class Tiger extends Cat {
}
public static class Lion extends Cat {
}
public static class Bull extends Animal {
}
public static class Cow extends Animal {
}
public static class Animal {
}
}
При наличии иерархии типов сначало нужно сравнивать с более частным случаем и последовательно переходить к более общим, если совпадения не обнаружено. При наследовании вида Animal - Cat - Tiger, тигр будет являться и котом, и животным. Поэтому результат будет зависеть только лишь от порядка сравнения типов в вашем коде.
Оператор instanceof проверяет возможность приведения объекта к заданному классу/интерфейсу, а не то что объект принадлежит к этому классу. Соответственно класс объекта корректнее будет определять через getClass().
public static String getObjectType(Object o) {
if (o.getClass() == Cat.class) return "Кот";
else if (o.getClass() == Tiger.class) return "Тигр";
else if (o.getClass() == Lion.class) return "Лев";
else if (o.getClass() == Bull.class) return "Бык";
else if (o.getClass() == Cow.class) return "Корова";
else return "Животное";
}
Если просто на пальцах, то когда вы пишете
public static class Tiger extends Cat {
}
Это значит, что класс данный класс принадлежит сразу двум типам: Cat и Tiger. То есть это и тигр и кот одновременно.
Далее у вас в методе первым делом проверяется, является ли объект котом? И да, для случая с тигром и львом вернется true, потому что они принадлежат типу кот.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости