Если внутренний класс является закрытым, к нему нельзя получить доступ по имени вне внешнего класса. Внутренние и внешние классы имеют доступ к закрытым методам друг друга и частным переменным экземпляра. Пока вы находитесь внутри внутреннего или внешнего класса, модификаторы public и private имеют одинаковый эффект. В вашем примере кода:
public class DataStructure {
// ...
private class InnerEvenIterator {
// ...
public boolean hasNext() { // Why public?
// ...
}
}
}
Что касается класса DataStructure, это полностью эквивалентно:
public class DataStructure {
// ...
private class InnerEvenIterator {
// ...
private boolean hasNext() {
// ...
}
}
}
Это потому, что только DataStructure может получить к нему доступ, поэтому не имеет значения, если вы установите его как открытый или закрытый. В любом случае, DataStructure остается единственным классом, который может получить к нему доступ. Используйте любой модификатор, который вам нравится, он не имеет никакой функциональной разницы. Единственный случай, когда вы не можете выбирать случайным образом, - это когда вы внедряете или расширяете, и в этом случае вы не можете уменьшить доступ, но можете его увеличить. Так что если у абстрактного метода есть защищенный доступ, вы можете изменить его на публичный. Конечно, никто не имеет никакого значения.
Если вы планируете использовать внутренний класс в других классах и, следовательно, делать его общедоступным, вам, вероятно, не стоит делать его внутренним классом.
Кроме того, я не вижу никаких требований для внутренних классов, расширяющих или реализующих другие классы. Для них это может быть обычным делом, но это определенно не обязательно.