В Java невозможно множественное наследование (речь в тексте именно о реализации, так что интерфейсы не в счёт), поэтому внешний класс может быть потомком только одного класса (назовём его A). Но если нужно повторно использовать поведение какого-то другого предка (назовём его B), то нужен, соответствено, и другой потомок – его роль и будет выполнять внутренний класс. А, будучи внутренним, он будет также иметь доступ ко всем членам внешнего класса, что и позволит в итоге использовать возможности и от A, и от B.