Привет! Задачу решил. Но больше методом тыка. Помогите разобраться: 1) В коде есть:
public String toString() {
            return name != null ? name.toUpperCase() : null;
Как я понимаю, эта конструкция возвращает name в верхнем регистре, если что=-то не null. И возвращает null в противном случае. На null что здесь проверяется? name? А откуда оно передается в public Cat(String name)? И в какой момент программа выполняет этот кусок: public String toString() { return name != null ? name.toUpperCase() : null; ? 2)
HashMap<String, Cat> map = addCatsToMap(cats);
Это какая-то конструкция вместо Map<String, String> map = new HashMap<String, String>(); ? мы создаем переменную map типа HashMap? а првила, как создавать описываем в операции addCatsToMap(cats), передавая туда массив имен котов? И раз мы что-то туда передали, то и операция addCatsToMap должна что-то в return вернуть? 3)
public static HashMap<String, Cat> addCatsToMap(String[] cats) {
        HashMap<String, Cat> map = new HashMap<String, Cat>();
        for(int i=0;i<cats.length; i++)
        map.put(cats[i], new Cat(cats[i]));
        return map;
    }
Как это работает? Что значит: HashMap<String, Cat> map = new HashMap<String, Cat>(); ? Ключ - стринг, а значение некий тип Cat? Что значит значение типа Cat? Этот тип описан ниже в public static class Cat { String name; ? Т.е. тип Cat - это просто имя name? А потенциально могло быть сколько угодно атрибутов описано в классе Cat& map.put(cats[i], new Cat(cats[i])); Здесь cats[i] понятно - это ключ и его значение = имени кота из массива. А почему значение записывается как new Cat(cats[i]) ? Почему не просто cats[i] ?