# Classes aninhadas

Na programação orientada a objeto (POO), uma classe aninhada, ou classe interior e uma classe declarada inteiramente dentro de uma outra classe ou de uma interface. É diferente de herança.

## Visão geral

Uma instancia de uma classe normal ou de nível superior pode existir sozinha. Por outro lado, uma instância de uma classe interna não pode ser instanciada sem estar vinculada a uma classe de nível superior.
Vamos utilizar uma noção abstrata de um Carro com quatro Rodas. Nossas Rodas tem uma característica especifica que depende de ser parte do nosso Carro. Essa noção não representa as Rodas como Rodas de uma forma geral, que poderiam fazer parte de qualquer veículo. Em vez disso, representa-os como específicos de um certo Carro. Podemos modelar essa noção usando classes internas da seguinte forma:
Temos a classe de alto nível Carro. Instâncias da classe Carro são compostas por quatro instâncias da classe Roda. Esta implementação particular de Roda é específico para um carro, de modo que o código não modele a noção geral de uma roda que seria melhor representado como uma classe de nível superior. Portanto, é semanticamente ligado a classe Carro e o código de Roda, de alguma forma, juntamente à sua classe externa, sendo uma unidade de composição de um carro. A roda de um carro particular é exclusivo para o carro, mas para a generalização, a roda é uma agregação de unidade para o carro.
Classes internas fornecem um mecanismo preciso para modelar essas conexões. Podemos referenciar nossa classe Roda como Carro.Roda, Carro sendo a classe de alto nível e Roda sendo a de baixo nível.
Classes internas, portanto, permitem a orientação a objeto de certas partes do programa que não estariam encapsulados em uma classe.
Maiores segmentos de código de uma classe pode ser melhor modelada ou reformulada como uma classe de nível superior separada, ao invés de uma classe interna. Isso iria tornar o código mais geral na sua aplicação e, portanto, mais re-utilizável, mas, potencialmente, pode ser prematuro generalização. Isto pode revelar-se mais eficaz, se o código tem muitas classes internas com a funcionalidade compartilhada.

## Tipos de classes aninhadas em Java

Em Java existem alguns tipos de classes aninhadas :

### Estática

* Membro estático da classe, também chamada de estática de classes aninhadas – Eles são declarados como static. Como outras coisas no escopo estático (i.e. métodos estáticos), eles não têm um delimitador instância, e não é possível acessar variáveis de instância e métodos da classe envolvente. Eles são quase idênticos, a não-classes aninhadas, exceto para o âmbito detalhes (que podem se referir a variáveis estáticas e métodos da classe envolvente sem qualificar o nome; outras classes que não são um de seus colocando aulas para qualificar o seu nome com a sua classe envolvente do nome). Aninhado interfaces são implicitamente static.

### Não estático / classes internas

Classe interna – As seguintes categorias são chamadas de classes internas. Cada instância de uma destas classes tem uma referência a um delimitador de instância (por exemplo, uma instância da classe envolvente), exceto para o local e anônimo classes declaradas no contexto estático. Portanto, eles podem implicitamente referem-se às variáveis de instância e métodos da classe envolvente. O delimitador de instância de referência pode ser explicitamente obtidos através EnclosingClassName.this. Classes internas não podem ter variáveis estáticas ou métodos, exceto para compilar-constante de tempo variáveis. Quando eles são criados, eles devem ter uma referência a uma instância da classe envolvente; o que significa que eles devem ser criados dentro de uma instância de método ou construtor da classe envolvente, ou (por membro anônimo e classes) ser criado usando a sintaxe enclosingInstance.newInnerClass.
* Classe membro – Eles são declarados fora de uma função (portanto, um "membro"), e não declarado "estática".
* Classes locais – são classes que são declaradas no corpo de uma função. Eles só podem ser referidas no resto da função. Eles podem usar variáveis locais e os parâmetros da função, mas apenas que são declarados "final". (Isto é porque o local instância da classe deve manter uma cópia separada da variável, como pode out-viver a função; assim como não tem a confusão de dois modificável variáveis com o mesmo nome no mesmo âmbito, a variável é forçado a ser não-modificáveis.) Pode ser muito útil para a criação de uma classe com o tipo genérico campos, onde o tipo de variáveis são definidas no método.
* Classes Anonimas – Estes são classes locais que são automaticamente declaradas e instanciadas no meio de uma expressão. Eles só podem diretamente estender uma classe ou implementar uma interface. Podem especificar argumentos para o construtor da superclasse, mas não pode ter um construtor (no entanto, esta não é uma limitação, uma vez que pode ter um inicializador de instância de bloco para executar qualquer inicialização).

## Linguagens de programação

* Classes aninhadas tornou-se uma característica da linguagem de programação Java a partir da versão 1.1.
* Classes aninhadas são também um recurso de D linguagem de programação, Visual Basic .NET, Ruby, C++ e C#.
* Em Python, é possível aninhar uma classe dentro de outra classe, método ou função.
* C++ tem classes aninhadas são como Java membro estático classes, exceto que eles não são declarados com "estática".
* BETA linguagem introduzida a noção de classes aninhadas.

## GUI code

Classes internas locais são muitas vezes utilizados em Java para definir retornos de chamada para o código GUI. Componentes podem então compartilhar um objeto que implementa um tratamento de eventos de interface ou estende-se um resumo do adaptador de classe, que contém o código a ser executado quando um determinado evento é acionado.
Classes aninhadas anonimas também são usados onde o código de manipulação de eventos é usado apenas por um componente e, portanto, não precisa de um nome de referência.
Isso evita uma grande monolítico, métodos com vários if-else para identificar a origem do evento. Esse tipo de código é muitas vezes considerado bagunçado e as variações da classe interna são considerados para ser melhor em todos os aspectos.