Temas abordados
  1. Classes Internas Comum
  2. Classes internas de Método

Classes Internas

Como o próprio nome diz, são classes que são definidas dentro de outra classe. Sendo que elas tem um relacionamento especial com sua classe externa (classe onde ela está definida), em relação as outras classes. Pelo fato de que elas podem acessar os membros privados da classe externa. É estranho, mais é verdade. Por que na verdade o que acontece, implicitamente a classe interna tem uma instância da classe externa. Então como se definir uma classe interna? Vamos lá.

public class OuterClass {

//Classe Interna class InnerClass {

private int integer;
public InnerClass() {

}

protected void myMethod(){

}
}
//…
}

Opa, bem simples(…). Veja temos uma classe OuterClass, onde definimos normalmente outra classe dentro desta, chamada InnerClass. Onde está nova classe pode ter tudo que, qualquer classe possa ter, como: variáveis de instância, métodos, blocos de inicialização, herança, implementação, etc. Mas, vale ressaltar que ela não pode definir membros estaticos(causará erro de compilação). Já que se isso ocorrer, ela terá que torna-se uma classe estática, deixando de ser uma classe interna comum.


Beleza, agora como instanciá-la?

Para instanciar um classe interna, é necessário(obrigatório) ter uma intância da classe externa. Em hipótese alguma, pode-se criar uma instância da interna, sem ter uma instancia da externa para associá-la. Então, mãos à obra!

1. Instânciando a partir da classe externa

public class OuterClass {

void execute(){

InnerClass v = new InnerClass();

}

//Classe Interna
class InnerClass {

protected void myMethod() {

}
}
}

Logo, vem a pergunta! Ueh, Não é preciso ter uma instância da classe externa para instanciar a interna? Sim, com certeza. Mas o que acontece, perceba que o método no qual estou instanciando a classe interna está definido em um contexto de instância, logo, está totalmente ligado a uma instância de OuterClass. Agora, se for um método estático dentro da classe externa deve ser assim:

InnerClass in = new OuterClass().new InnerClass();

Que sintaxe louca não! Mas, é assim mesmo, obtenho uma instância da externa e crio a instância da interna.

2. Instanciando em outras classes da aplicação

O seguinte cenário, refere-se a instânciação dentro de outra classe da aplicação(Obviamente deve-se levar em conta, o modificador que foi atribuído tanto a classe interna, como a externa).

OuterClass.InnerClass in = new OuterClass().new InnerClass();

Bem diferente também, mas é essa a maneira de declara uma referência e instânciar a classe a interna. Finalizando quero ressaltar os modificadores permitidos nas classes internas, são: public, protected, default e private e os não relacionados a acesso: final e abstract

Classes Internas de Método

Para terminar a primeira parte desse pequeno tutorial, falarei sobre classes internas de método.

Parece bem estranho, uma classe dentro de um método, sim, é verdade. Da mesma forma que declaramos as classes internas em uma classe, iremos declara dentro de um método. Vejamos como é simples.


protected void myMethod() {

class InnerOfMethod{

}
}

Pronto, temos uma classe declara dentro de um método. Só que, diferentemente do outro tipo de classe interna, está só pode ser instanciada dentro do método, ou seja, ela tem como escopo o do método na qual foi definida. Ela também não pode ser declarada como estática em hipótese alguma, os únicos modificadores que podem ser atribuídos a ela, são: final e abstract.

Outro ponto importante a ser lembrado, é que ela só pode acessar as variáveis locais marcadas com final. Porém mantendo seu relacionamento especial com a classe externa, acesso aos membros privados. Como instanciá-las?

Já que, ela só poderá ser usada no método, só existe uma forma de instaciá-la:

protected void myMethod() {

class InnerOfMethod {

private int value = 10;

public int getValue() {

return value;

}

public void setValue(int value) {

this.value = value;

}
}

//Logo após a sua definição
InnerOfMethod iom = new InnerOfMethod();

iom.getValue();

}

Para tanto, devemos lembrar que também não podem ser definidos membros estáticos, já que elas não podem serem estáticas igual a interna comum(como é conhecida).

É isso ai pessoal, a primeira parte sobre classes internas termina por aqui. Obrigado!

Até o próximo…!