Uma classe interna é uma classe que é subordinada a uma outra classe, sendo definida no corpo dessa outra classe. Dependendo de onde e como se dá essa definição, a classe interna pode ser de diferentes tipos.
Uma classe membro tem seus objetos sempre associados a objetos da classe topo. Os objetos da classe membro têm acesso aos membros (atributos e métodos) da classe topo. Em geral, esse tipo de classe define algum tipo de serviço de apoio que complementa a funcionalidade da classe topo. Uma classe membro não pode conter membros internos que sejam static.
public class ClasseTopo { // definição de membros protected class ClasseMembro { // membros internos } }
Uma classe membro estática (ou uma interface membro estática) é similar a uma classe membro, mas tem acesso apenas aos membros declarados como static na classe topo. Sendo estática, seus membros internos são acessíveis pela classe topo ou por outras classes membros estáticas.
public class ClasseTopo { // definição de membros public static class ClasseMembroEstática { // membros internos } }
Uma classe local é um tipo de classe interna definida no escopo de um bloco de código, ou seja, dentro de um método. Além das facilidades associadas a uma classe membro, um objeto de uma classe local tem acesso a variáveis do método que tenham sido declaradas como final.
public class ClasseTopo { // definição de membros public UmaClasse umMetodo() { // ... class ClasseLocal extends UmaClasse { // definição da classe local } // ... ClasseLocal obj = new ClasseLocal(); // ... return obj; } }
Classes anônimas oferecem uma forma de definir uma classe local para a qual apenas um objeto será criado. Neste caso, o nome da classe é irrelevante e pode portanto ser omitido. A sintaxe para definição de uma classe anônima já combina a criação de um objeto dessa classe.
public class ClasseTopo { // definição de membros public UmaInterface outroMetodo() { // ... return new UmaInterface() { // definição da classe local, anônima }; } }