Classes e interfaces aninhadas/Internas e anonimato

Em java é possível definir uma classe ou interface aninhadas.

 

class AltoNivel{

  static class ClasseAninhadaEstatica{ ... }

  class ClasseInterna{ ... }

}

 

No trecho de programa acima a ClasseAninhadaEstatica tem caracteristicas semelhantes aos métodos estáticos, não pode fazer referência a instâncias da classe AltoNivel.  Uma instância de ClasseInterna só pode existir no contexto de uma instância da classe AltoNível.

A linguagem Java permite definir as chamadas classes anônimas. Definir uma classe anônima na verdade significa instânciar um objeto cuja classe é anônima! Existem duas maneiras de definir classes anônimas (ou seja: existem duas formas de instânciar um objeto cuja classe seja anônima):

1.    new <nomeDaClasseBase>(<argumentos opcionais>){corpo da classe}

2.    new <nomeDaInterface>(){corpo da classe}

A primeira forma corresponde “grosso modo” a:
class <Anonima> extends <nomeDaClasseBase> { corpo da classe }
new <Anonima>()

Instancie um objeto de uma classe que não tem nome e que estende a classe <nomeDaClasseBase>.

A segunda forma corresponde “grosso modo” a:
class <Anonima> extends Object implements <nomeDaInterface>{corpo da classe}
new <Anonima>()

Esta segunda forma pode ser descrita como sendo: instancie um objeto de uma classe que não tem nome que implementa a interface <nomeDaInterface> e que estende a classe Object. Neste caso a classe anônima só pode implementar 1(uma) interface.e estender somente a classe Object.

Não há previsão de construtores para classes anônimas. Os argumentos opcionais da primeira forma acima são passados para o construtor adequado da classe base. Na segunda forma, os parênteses não devem apresentar argumentos (não existem construtores para interfaces e a classe Object não possui construtores com argumentos!). As classes aninhadas/internas e as classes anônimas são usadas, principalmente,  no contexto de programação de interfaces gráficas de usuário (GUI).

O programa abaixo mostra um uso sintético de classes anônimas,  neste programa as referências retornadas pelo operador new são descartadas e estamos interessados apenas no efeito colateral das iniciações dos campos de instância:
interface I{}
class prog{
  public static void main(String[] arg){
    new Object(){
      int i=m();
      int m(){System.out.println("1"); return 1;}
  };
    new I(){
      int i=m();
      int m(){System.out.println("1"); return 1;}};
  }
}