• Nenhum resultado encontrado

7.11 Classes Aninhadas

No documento Linguagem Java COMPLETA (páginas 101-103)

Classe aninhada (nested class) surgiu a partir da versão 1.1 do Java. Assim como métodos e propriedades, uma classe aninhada é considerada um membro da classe.

public class Externa { class Interna {

// ... }

}

Uma classe aninhada é utilizada para reforçar sua dependência com a sua classe externa, ou seja, ela depende dos outros membros da classe externa para funcionar. Por exemplo, suponha um cursor que depende totalmente de um editor de texto:

public class EditorDeTexto { class Cursor {

// ... }

}

Alguns consideram que este novo recurso afetou a legibilidade do código, tornando-o mais complexo, inclusive aninhando uma à outra de forma recursiva, como por exemplo:

public class A { class B { class C { } } }

Apesar do recurso de classes aninhadas dificultar a legibilidade (se for mal aplicado), a maioria aceita que classes internas é um recurso que permite organizar melhor o seu conjunto de classes. Especialmente classes internas são muito úteis para:

 Tratamento de eventos gráficos: clique de mouse, pressionamento de botão, etc. É utilizado bastante este recurso quando se estuda a parte de tratamento de eventos gráficos AWT.

 Classe aninhadas de teste: em vez de se criar uma classe externa à uma classe, para testar as suas funcionalidades, é possível e recomendável criar uma classe aninhada que poderá ter vários métodos de teste. Iremos ver sobre isso mais à frente.

Classe aninhada é um recurso que permite

definir uma classe dentro de outra.

//atribuindo valor a variável referência Carro carro1 = new Carro();

carro1.ano = "2001"; carro1.modelo= "fusca"; carro1.cor = "prata";

Figura 2.4 – Layout Memória após inicialização //criando novo alias

Carro carro2 = carro1;

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.3 Membros de Instância

Cada objeto criado deverá ter sua própria instância de variáveis (atributos) definidas pela classe. Os métodos definem o comportamento de um objeto. Isto é importante, pois denota que um método pertence a cada objeto da classe. Porém não devemos confundir isto com a implementação do método, que é compartilhada por todas as instâncias da classe.

2.3.1 Invocação de Métodos

Objetos se comunicam pela troca de mensagens, isto significa que um objeto pode ter que mostrar um comportamento particular invocando uma operação apropriada que foi definida no objeto. Em Java, isto é feito pela

chamada de um método em um objeto usando o operador binário "." (ponto),

devendo especificar a mensagem completa: o objeto que é o recebedor da mensagem, o método a ser invocado e os argumentos para o método (se houver). O método invocado no recebedor pode também enviar informações de volta ao objeto chamador através de um valor de retorno. O método chamado deve ser um que esteja definido pelo objeto.

Os valores das variáveis em um objeto constituem

o seu estado. Dois objetos distintos têm

o mesmo estado se suas variáveis membro têm os

mesmos valores.

7.11.1 Classe Aninhada

Veja o seguinte exemplo, Listagem 7.37, ele define a classe ClasseExterna (linha 1), uma classe interna (linha 3), e a instância (linha 10) :

public class ClasseExterna { public class ClasseInterna {

public String toString() { return "Classe Interna"; }

} // ClasseInterna

public String toString() {

ClasseInterna ci = new ClasseInterna(); return "Classe Externa com " + ci;

} // toString

public static void main(String[] args) { ClasseExterna ce = new ClasseExterna(); System.out.println(ce);

} // main

} // ClasseExterna

Listagem 7.37

Note neste exemplo, que é possível ter classes dentro de outras, onde a classe ClasseExterna, definiu uma classe internamente denominada ClasseInterna. Ambas sobrepõe o método toString(), que é executado automaticamente toda vez que é invocado (chamado) o método System.out.print().

Note que quando se compila ClasseExterna.java, surgem dois arquivos .class:  ClasseExterna.class - este é o resultado da compilação de ClasseExterna.  ClasseExterna$ClasseInterna.class - este é o resultado da compilação de

ClasseInterna, porém como ela é interna, a sua classe externa também é

listada, separada pelo cifrão ($).

7.11.2 Classes aninhadas estáticas

Assim como outros membros da classe, como métodos e propriedades, classes aninhadas também pode ser estáticas denominadas classes aninhadas estáticas (static

nested class) ou não estáticas denominadas classes internas de instância (instance inner class). Assim, quando dizemos classe interna nunca referimos a uma classe-

membro estática; enquanto que classe aninhada é um termo geral tanto para classes- membro estáticas ou não. Vejamos o exemplo:

public class ClasseTopo {

// esta é uma classe aninhada estática // static nested class

public static class ClasseAninhadaEstatica { public static void main(String[] args) {

System.out.println("Classe Aninhada Estática"); }

}

// esta é uma classe interna de instancia // instance inner class

class ClasseInterna {

// somente classes aninhadas estáticas podem ter membros estáticos // as duas declarações abaixo retornariam erro

Assim como outros membros da classe,

como métodos e propriedades, classes aninhadas também pode ser

Linguagem de Programação Java

Seja um Profissional Aprendendo com Profissionais

www.3way.com.br 12

//atribuindo valor a variável referência Carro carro1 = new Carro();

carro1.ano = "2001"; carro1.modelo= "fusca"; carro1.cor = "prata";

Figura 2.4 – Layout Memória após inicialização //criando novo alias

Carro carro2 = carro1;

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.3 Membros de Instância

Cada objeto criado deverá ter sua própria instância de variáveis (atributos) definidas pela classe. Os métodos definem o comportamento de um objeto. Isto é importante, pois denota que um método pertence a cada objeto da classe. Porém não devemos confundir isto com a implementação do método, que é compartilhada por todas as instâncias da classe.

2.3.1 Invocação de Métodos

Objetos se comunicam pela troca de mensagens, isto significa que um objeto pode ter que mostrar um comportamento particular invocando uma operação apropriada que foi definida no objeto. Em Java, isto é feito pela

chamada de um método em um objeto usando o operador binário "." (ponto),

devendo especificar a mensagem completa: o objeto que é o recebedor da mensagem, o método a ser invocado e os argumentos para o método (se houver). O método invocado no recebedor pode também enviar informações de volta ao objeto chamador através de um valor de retorno. O método chamado deve ser um que esteja definido pelo objeto.

Os valores das variáveis em um objeto constituem

o seu estado. Dois objetos distintos têm

o mesmo estado se suas variáveis membro têm os

mesmos valores.

103

No documento Linguagem Java COMPLETA (páginas 101-103)

Documentos relacionados