Когда вы распечатываете объект, он вызывает метод toString (). В первом операторе вы создаете новый объект, а также переопределяете метод с именем toString. Поэтому этот метод toString () вызывается при печати объекта.
Во втором операторе вы также создаете объект, но не переопределяете метод toString (), чтобы он использовал метод toString () класса Object.
Для нового вопроса, эта ссылка имеет хорошее объяснение для вашего понимания:
Анонимные классы
Вот копия объяснения:
new className(optional argument list){classBody}
Это выражение создает новый объект из неназванного и ранее неопределенного класса, который автоматически расширяет класс с именем className и который не может явно реализовать какие-либо интерфейсы . Тело нового класса задается classBody.
Результатом выполнения этого выражения является то, что определен новый класс , который расширяет className , создан экземпляр нового объекта нового класса и выражение заменено по ссылке на новый объект .
new interfaceName(){classBody}
Это выражение создает новый объект из неназванного и ранее неопределенного класса , который автоматически реализует интерфейс с именем interfaceName и автоматически расширяет класс с именем Object . Класс может явно реализовывать один и только один интерфейс , а не может расширять любой класс, кроме Object . Еще раз, тело нового класса дается classBody.
Вам теперь понятно?