(→Exercícios) |
|||
(14 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
{{NAVPO}} | {{NAVPO}} | ||
− | + | {{TOCright}} | |
+ | Na descrição mais simples, uma classe interna não é mais do que uma classe definida dentro de outra, sendo o acesso a ela controlado pela classe externa através das habituais especificações '''public''', '''private''', etc. Ainda nesta abordagem simples, este processo permite definir âmbitos restritos de visibilidade e acesso. | ||
− | + | Em C++ e para classes internas Java declaradas '''static''', a descrição "simples" é a que realmente é implementada pela linguagem. Nestes casos, serve apenas como processo de organização de código, não havendo necessariamente uma relação entre as classes internas e as externas que as contêm. Embora estes usos tenham utilização, especialmente em C++ (onde são a única possibilidade), não são a forma habitual de definir classes internas em Java. | |
+ | == Classe internas (não "static") em Java == | ||
+ | |||
+ | As classes internas em Java são mais que classes definidas dentro de outras classes. A definição destas classes implica que existe uma relação estreita entre uma classe interna e a externa que a contém. A definição é tal que as instâncias de classes internas têm acesso implícito às instâncias das classes externas, no contexto das quais foram criadas. Como se verá abaixo esta ligação é muito importante para os aspectos interessantes da programação utilizando este tipo de abstracções. | ||
+ | |||
+ | De modo análogo ao do acesso nos métodos de uma classe, o código de uma classe interna é considerado código da classe externa e pode ser por ela utilizada. Reciprocamente, o código da classe interna tem acesso implícito (directo) ao código e atributos da classe externa, mesmo que esta os tenha definido como '''private'''. | ||
+ | |||
+ | A criação de objectos com base em classes internas, na segunda definição, não é sequer possível sem a existência prévia de uma instância da classe externa. Os vários exemplos abaixo ilustram esta questão e introduzem nova formas de escrita (sintaxe) relacionadas com a criação e inicialização ('''new''' e construtores) destes objectos. | ||
<!-- diagrama da relação UML e instâncias --> | <!-- diagrama da relação UML e instâncias --> | ||
<!-- exemplo básico --> | <!-- exemplo básico --> | ||
<!-- uso de static e desligar da relação --> | <!-- uso de static e desligar da relação --> | ||
+ | |||
+ | ==Organização de código== | ||
+ | * Organização de interfaces e classes e acesso ao código | ||
+ | * Classes internas locais (métodos e blocos) | ||
+ | * Classes anónimas | ||
==Aspectos Básicos== | ==Aspectos Básicos== | ||
Line 13: | Line 26: | ||
* Partilha de acesso entre classe externa e interna | * Partilha de acesso entre classe externa e interna | ||
* Herança e classes internas e externas | * Herança e classes internas e externas | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
==Exemplos== | ==Exemplos== | ||
Line 24: | Line 31: | ||
Estes exemplos ilustram o uso de classes internas, evidenciando vantagens relativamente à ocultação de pormenores de implementação e consequente melhoria na abstracção e organização de código. | Estes exemplos ilustram o uso de classes internas, evidenciando vantagens relativamente à ocultação de pormenores de implementação e consequente melhoria na abstracção e organização de código. | ||
+ | === Gatos Iteráveis === | ||
O exemplo dos gatos iteráveis mostra como iterar um gato constituído por várias partes. | O exemplo dos gatos iteráveis mostra como iterar um gato constituído por várias partes. | ||
Começa-se com uma implementação menos elegante e termina-se com a "melhor" implementação. | Começa-se com uma implementação menos elegante e termina-se com a "melhor" implementação. | ||
Line 29: | Line 37: | ||
* [[Classes Internas (Java)/Gatos Iteráveis|Gatos Iteráveis]] -- como iterar um gato? | * [[Classes Internas (Java)/Gatos Iteráveis|Gatos Iteráveis]] -- como iterar um gato? | ||
+ | === Comparadores em Java === | ||
+ | Os exemplos seguintes dizem respeito a interfaces Java. | ||
+ | |||
+ | * [[Classes Internas (Java)/Comparações em Java|Comparações em Java]] -- definição de comparadores usando interfaces Java pré-definidas. | ||
+ | |||
+ | === Gato e Estômago === | ||
Os exemplos apresentados nos vários com um gato e um estômago são semelhantes aos anteriores, mostrando como localizar a definição de uma classe interna junto do código onde é utilizada. | Os exemplos apresentados nos vários com um gato e um estômago são semelhantes aos anteriores, mostrando como localizar a definição de uma classe interna junto do código onde é utilizada. | ||
* [[Classes Internas (Java)/Gato e Estômago|Gato e Estômago]] -- gatos e estômagos (várias configurações) (exemplo antigo -- ver iteradores acima) | * [[Classes Internas (Java)/Gato e Estômago|Gato e Estômago]] -- gatos e estômagos (várias configurações) (exemplo antigo -- ver iteradores acima) | ||
+ | === Carros e Motores === | ||
Os exemplos de carros e motores apresentam casos em que existe herança, tanto nas classes externas, como nas classes internas e casos mistos. | Os exemplos de carros e motores apresentam casos em que existe herança, tanto nas classes externas, como nas classes internas e casos mistos. | ||
Note-se que alguns destes casos não são "normais" e apenas se apresentam para evidenciar consequências relativas à programação com classes internas e herança. | Note-se que alguns destes casos não são "normais" e apenas se apresentam para evidenciar consequências relativas à programação com classes internas e herança. | ||
Line 44: | Line 59: | ||
* [[Classes Internas (Java)/Exercício 01: Interfaces java.lang.Comparable e java.util.Comparator|Exercício 01: Interfaces java.lang.Comparable<T> e java.util.Comparator<T>]] | * [[Classes Internas (Java)/Exercício 01: Interfaces java.lang.Comparable e java.util.Comparator|Exercício 01: Interfaces java.lang.Comparable<T> e java.util.Comparator<T>]] | ||
+ | * [[Classes Internas (Java)/Exercício 02: Iteração|Exercício 02: Iteração]] | ||
+ | * [[Classes Internas (Java)/Exercício 03: Iteração|Exercício 03: Iteração]] -- Menu | ||
+ | * [[Classes Internas (Java)/Exercício 04: Iteração|Exercício 04: Iteração]] -- NameList | ||
+ | [[category: Ensino]] | ||
+ | [[category:PO]] | ||
[[category:Java]] | [[category:Java]] | ||
− | |||
− |
Na descrição mais simples, uma classe interna não é mais do que uma classe definida dentro de outra, sendo o acesso a ela controlado pela classe externa através das habituais especificações public, private, etc. Ainda nesta abordagem simples, este processo permite definir âmbitos restritos de visibilidade e acesso.
Em C++ e para classes internas Java declaradas static, a descrição "simples" é a que realmente é implementada pela linguagem. Nestes casos, serve apenas como processo de organização de código, não havendo necessariamente uma relação entre as classes internas e as externas que as contêm. Embora estes usos tenham utilização, especialmente em C++ (onde são a única possibilidade), não são a forma habitual de definir classes internas em Java.
As classes internas em Java são mais que classes definidas dentro de outras classes. A definição destas classes implica que existe uma relação estreita entre uma classe interna e a externa que a contém. A definição é tal que as instâncias de classes internas têm acesso implícito às instâncias das classes externas, no contexto das quais foram criadas. Como se verá abaixo esta ligação é muito importante para os aspectos interessantes da programação utilizando este tipo de abstracções.
De modo análogo ao do acesso nos métodos de uma classe, o código de uma classe interna é considerado código da classe externa e pode ser por ela utilizada. Reciprocamente, o código da classe interna tem acesso implícito (directo) ao código e atributos da classe externa, mesmo que esta os tenha definido como private.
A criação de objectos com base em classes internas, na segunda definição, não é sequer possível sem a existência prévia de uma instância da classe externa. Os vários exemplos abaixo ilustram esta questão e introduzem nova formas de escrita (sintaxe) relacionadas com a criação e inicialização (new e construtores) destes objectos.
Estes exemplos ilustram o uso de classes internas, evidenciando vantagens relativamente à ocultação de pormenores de implementação e consequente melhoria na abstracção e organização de código.
O exemplo dos gatos iteráveis mostra como iterar um gato constituído por várias partes. Começa-se com uma implementação menos elegante e termina-se com a "melhor" implementação.
Os exemplos seguintes dizem respeito a interfaces Java.
Os exemplos apresentados nos vários com um gato e um estômago são semelhantes aos anteriores, mostrando como localizar a definição de uma classe interna junto do código onde é utilizada.
Os exemplos de carros e motores apresentam casos em que existe herança, tanto nas classes externas, como nas classes internas e casos mistos. Note-se que alguns destes casos não são "normais" e apenas se apresentam para evidenciar consequências relativas à programação com classes internas e herança.