Olha a classe ArrayList e AbstractList
todas dentro de java.util ...
AbstractList tem uma classe Aninhada, que é Itr ... essa classe serve pra ela implementar Iterable, que precisa liberar um Iterator, e pra isso ela faz uso de uma classe Aninhada
public class AbstractList<T> implements Iterable<T> {
public Iterator<T> iterator() { //este método é para implementar Iterable<T>
return new Itr();
}
//...
private class Itr implements Iterator<T> {
//...metodos de Iterator
}
}
a classe aninhada existe nesse caso, pois Itr acessa dados private de AbstractList para fazer a iteração, e tornar List um objeto possivel de ser usado em um foreach
.......
ArrayList por sua vez, usa Herença, e extende AbstractList, visto que varios métodos de AbstractList já estão prontos, e podem ser usados para implementar a interface List