В строчке 26 создается массив с именами котов.
В строчке 28 вызывается метод addCatsToMap с массивом котов в качестве аргумента.
В строчках 36-44:
1) Создается новый объект типа HashMap.
2) В цикле добавляются все коты из массива в карту, где ключ - имя кота, а значение - сам кот с его именем.
3) Возвращается созданная карта с записями вида имя_кота - кот.
В строчках 30-32 - выводятся все значение в формате "имя_кота - кот", а так, как метод toString у класса Cat переопределен, то вместо кота выводится name.toUpperCase(), то есть имя большими буквами.
только не совсем понял, в 28 не просто вызывается метод,
там присваивается переменной значение возвращенное методом?
Да
и не совсем ясно что за переопределение в классе cat
Дальше будет в курсах примерно на 10-12 уровнях, или можете самостоятельно поискать материал в Интернете про то, что такое наследование и так далее.
Экземпляр класса Cat, когда мы создаем объект Cat, который должен быть создан только с атрибутом (String name) ( потому что это конструктор так создан):
publicCat(String name){this.name = name;}
будет переопределен
publicStringtoString()
и вернется атрибут name, но уже в верхнем регистре: