По идее всё должно работать, но не отправлял, чтобы получить разъяснения) 1) Почему объект нельзя инициализировать в цикле, а переменную можно (строка 13 класса Solution)? т.е. String key получает значение в цикле, а Person person; - нет? Почему обязательно сперва нужно создать Person person = null; Почему без null работать не будет? 2) Строка 15 класса Solution. while ((key = reader.readLine().equals("user")) || (key.equals("loser")) || (key.equals("coder")) || (key.equals("proger"))) не работает (((key = reader.readLine()).equals("user")) || (key.equals("loser")) || (key.equals("coder")) || (key.equals("proger"))) работает. Почему? Зачем дополнительно обносить (key = reader.readLine()).equals перед equals в скобки? То есть всё остальное в скобки выносить, чтобы сравнивать boolean и boolean как бы понятно. А здесь же результатом должно быть boolean т.е. присваивается key значение String, которое сравнивается с другим String и на выходе boolean. Почему пишет про то, что нельзя сравнивать boolean и String? 3) обращение к внутренним классам Person как к Person.User понятно, но что это за извращение? зачем создавать классы внутри интерфейса, которые его же и реализуют? Это получается внутренний класс интерфейса? Что даёт? У меня эта конструкция трохи в голове не укладывается.