Интерфейсы `Iterable` , `Iterator` и цикл `for-each` связаны между собой и используются для перебора элементов коллекции или последовательности. Интерфейс `Iterable` определяет метод `iterator()` , который возвращает объект типа `Iterator` . Он позволяет коллекции или последовательности быть перебираемыми. Интерфейс `Iterator` определяет методы для перебора элементов коллекции или последовательности. Он содержит методы `hasNext()` , `next()` , `remove()` и другие. Метод `hasNext()` проверяет наличие следующего элемента, метод `next()` возвращает следующий элемент, а метод `remove()` удаляет текущий элемент из коллекции. Цикл `for-each` является удобной конструкцией языка, которая автоматически использует `Iterator` для перебора элементов коллекции или последовательности. Он позволяет перебирать элементы без явного использования методов `hasNext()` и `next()` . Вот пример использования цикла `for-each` для перебора элементов коллекции: List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); for (Integer number : numbers) { System.out.println(number); } В этом примере `List` реализует интерфейс `Iterable` , и метод `iterator()` возвращает объект `Iterator` . Цикл `for-each` автоматически использует этот `Iterator` для перебора элементов `List` . Таким образом, `Iterable` , `Iterator` и цикл `for-each` тесно связаны между собой и используются для удобного перебора элементов коллекции или последовательности.