Difference between revisions of "Classes Internas (Java)"

From Wiki**3

(Exercícios)
 
(32 intermediate revisions by the same user not shown)
Line 1: Line 1:
Material correspondente às Aulas 12 e 13.
+
{{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.
  
Classes internas em Java.
+
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.
  
==Princípios Básicos==
+
== Classe internas (não "static") em Java ==
* Classes internas e os vários aspectos de definição: classes internas simples; implementação de interfaces
+
 
* Ligação implícita entre objectos de classes internas e a instância da classe externa
+
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.
* Partilha de acesso entre classe externa e interna
+
 
* Herança e classes internas e externas
+
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 -->
 +
<!-- exemplo básico -->
 +
<!-- uso de static e desligar da relação -->
  
 
==Organização de código==
 
==Organização de código==
* Sintaxe
 
 
* Organização de interfaces e classes e acesso ao código
 
* Organização de interfaces e classes e acesso ao código
 
* Classes internas locais (métodos e blocos)
 
* Classes internas locais (métodos e blocos)
 
* Classes anónimas
 
* Classes anónimas
 +
 +
==Aspectos Básicos==
 +
* Classes internas e os vários aspectos de definição: classes internas simples; implementação de interfaces
 +
* Ligação implícita entre objectos de classes internas e a instância da classe externa
 +
* Partilha de acesso entre classe externa e interna
 +
* Herança e classes internas e externas
  
 
==Exemplos==
 
==Exemplos==
  
* [[PO 2005/06: Exemplos da Aula 12|Exemplos de classes internas e externas]]: <code>Gato</code> e <code>Estômago</code>
+
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.
* [[PO 2005/06: Exemplos da Aula 13|Exemplos de herança com classes internas e externas]]: <code>Carro</code> e <code>Motor</code>
+
 
 +
=== Gatos Iteráveis ===
 +
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.
 +
 
 +
* [[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.
 +
 
 +
* [[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.
 +
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.
 +
 
 +
* [[Classes Internas (Java)/Carros e Motores|Carros e Motores]] -- aspectos e problemas de herança com carros e motores
 +
 
 +
[[Category:Ensino]]
 +
[[Category:PO]]
 +
 
 +
== Exercícios ==
 +
 
 +
* [[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:PO 2005/2006]]
+
[[category: Ensino]]
 +
[[category:PO]]
 +
[[category:Java]]

Latest revision as of 00:19, 8 October 2022

Programação com Objectos
Introduction
Creation and Destruction
Inheritance & Composition
Abstraction & Polymorphism
Code Organization
Java Topics
Inner Classes
Enumerations
Data Structures
Exceptions
Input/Output
RTTI
Other Topics
JUnit Tests
UML Topics
Design Patterns
"Simple" Factory
Composite & Visitor
Command
Strategy & State
Template Method
Observer
Abstract Factory
Decorator & Adapter
Façade (aka Facade)

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.

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

  • Classes internas e os vários aspectos de definição: classes internas simples; implementação de interfaces
  • Ligação implícita entre objectos de classes internas e a instância da classe externa
  • Partilha de acesso entre classe externa e interna
  • Herança e classes internas e externas

Exemplos

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. Começa-se com uma implementação menos elegante e termina-se com a "melhor" implementação.

Comparadores em Java

Os exemplos seguintes dizem respeito a interfaces Java.

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.

  • 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. 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.

Exercícios