Classe Aninhada e Herança

Bom dia Galera do java de pois de ler algumas coisas, sobre este assunto restaram algumas duvidas sobre as principais diferenças entre uma e outra,
queria ouvir o conceito de vocês.
vlw!!

Definição de Herança uma subclasse que usa campos e metodos da Super classe.
Sendo eles publicos ou protegidos.

Definição de Classe aninhada é uma classe como membro de outra. Uma classe dentro de outra

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

[code]public class AbstractList implements Iterable {

public Iterator<T> iterator() { //este método é para implementar Iterable<T>
     return new Itr();
}

//...
private class Itr implements Iterator<T> {
     //...metodos de Iterator
}

}[/code]

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

Muito bom Lavieri, vlw pela atenção!
gente pra quem tem alguma duvida olha esse exemplo, que foi onde observei o tratamento de CLASSE ANINHADA e tirei minhas duvidas

package lista;
import java.util.Scanner;
/**
 *
 * @author Diego
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        //lista vazia (sem nós)
        No lista=null;
        //cria objeto Scanner para leitura de dados
        Scanner sc = new Scanner(System.in);
        String aux;
        //laço para solicitação de dados
        do{System.out.print("Digite um palavra(<fim>Encerra);");

            aux=sc.next();
            if(!aux.equals("<fim>")){
            No novo = new No(aux, lista);
            lista = novo;

            }
        }while(!aux.equals("<fim>"));

        System.out.println("Lista das palavras");
        //usa variavel auxiliar p/ navegar (percorrer) a lista
        No no = lista;
        while(no!=null){
            System.out.println(no.nome + " ");
            no = no.proximo;

        }
        System.out.println("<fim>");
    }
    //classe aninhada estática

    private static class No{
    public String nome;
    public No proximo;

    public No(){
    this(null, null);

    }
    public No(String n, No p){

    nome = n; proximo=p;
    }
    }

}