Escolar Documentos
Profissional Documentos
Cultura Documentos
Programação
Avançada em JAVA
2º ANO : Desenvolvimento e Mudança
Organizacional
CÓDIGO ISCED1-GSI 7
GSITOTAL HORAS/ 1 100
SEMESTRE
CRÉDITOS (SNATCA) 4
NÚMERO DE TEMAS 5
UNIISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em
Java
Website: www.isced.edu.mz
i
UNIISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em
Java
ii
UNIISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em
Java
Índice
Visão geral 1
Benvindo à Disciplina/Módulo Programação Avançada em Java .................................... 1
Objetivos do Módulo ............................................................................................... 1
Quem deveria estudar este módulo ................................................................................... 1
Como está estruturado este módulo .................................................................................. 2
Ícones de atividades .......................................................................................................... 3
Habilidades de estudo ....................................................................................................... 3
Precisa de apoio? .............................................................................................................. 5
Tarefas (avaliação e auto-avaliação) ................................................................................. 6
Avaliação .......................................................................................................................... 6
iii
UNIISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em
Java
iv
UNIISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em
Java
“O equals” ............................................................................................ 59
Sumário ................................................................................................................. 60
Exercícios de autoavaliação .................................................................................. 60
Perguntas ...................................................................................................... 60
Respostas: .................................................................................................... 61
Exercícios para avaliação ...................................................................................... 65
Perguntas ...................................................................................................... 65
Unidade temática 2.3: Polimorfismo e abstração. .......................................................... 66
Introdução ....................................................................................................................... 66
O problema ............................................................................................................ 67
Definição ............................................................................................................... 72
Benefícios do polimorfismo .................................................................................. 73
O polimorfismo – a conclusão............................................................................... 76
Classes abstratas e Abstração ................................................................................ 76
Interface ................................................................................................................. 80
Definição de Interface ......................................................................... 84
Exemplo 3 ............................................................................................ 84
Sumário ................................................................................................................. 88
Exercícios de autoavaliação .................................................................................. 89
Perguntas ...................................................................................................... 89
Respostas: .................................................................................................... 89
Exercícios para avaliação ...................................................................................... 90
Perguntas ...................................................................................................... 90
Execícios do Tema .......................................................................................................... 92
Exercios de autoavaliação ..................................................................................... 92
Perguntas ...................................................................................................... 92
Respostas...................................................................................................... 94
Execícios para avaliação...................................................................................... 101
Referências Bibliográficas ............................................................................................ 103
v
UNIISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em
Java Sumário ............................................................................................................... 112
Exercícios de autoavaliação ................................................................................ 113
Perguntas .................................................................................................... 113
Respostas.................................................................................................... 113
Exercícios para avaliação .................................................................................... 114
Unidade temática 3.3 BufferedWriter e BufferedReader ............................................. 116
Introdução ............................................................................................................ 116
Streams “buferizados” (buffered) ........................................................................ 117
Abrindo um ficheiro de texto para a escrita usando BufferedWriter .................. 117
Leitura de dados em ficheiro de texto usando BufferedReader .......................... 118
Problemas envolvendo ficheiros de texto ............................................................ 119
Atualizando um ficheiro de texto ........................................................................ 121
Sumário ............................................................................................................... 123
Exercícios de autoavaliação ................................................................................ 123
Perguntas .................................................................................................... 123
Respostas: .................................................................................................. 125
Exercícios para avaliação .................................................................................... 130
Unidade temática 3.4: FileInputStream e FileOutputStream ........................................ 132
Introdução ..................................................................................................................... 132
Porquê FileOutputStream e FileInputStream ...................................................... 132
Cópia de ficheiro usando FileInputStream e FileOutputStream ......................... 132
Sumário ............................................................................................................... 134
Exercícios de autoavaliação ................................................................................ 135
Perguntas .................................................................................................... 135
Respostas.................................................................................................... 135
Exercícios para avaliação .................................................................................... 136
Unidade temática 3.5. ObjectInputStream E ObjectOutputStream .............................. 138
Introdução ..................................................................................................................... 138
Entendendo o processo de serialização e de-serialização ................................... 138
Processo de escrita de objetos em ficheiro .......................................................... 139
Processo de recuperação de objetos em ficheiro ................................................. 139
Exemplo............................................................................................................... 140
Sumário ............................................................................................................... 143
Exercícios de autoavaliação ................................................................................ 144
Perguntas .................................................................................................... 144
Respostas: .................................................................................................. 144
Exercícios para avaliação .................................................................................... 147
Unidade temática 3.6: Entrada de dados usando a classe Scanner ............................... 149
Introdução ..................................................................................................................... 149
Processo de interação entre o utilizador e os programas ..................................... 149
Inicialização do Scanner e seu fecho ................................................................... 150
Métodos disponibilizado pelo Scanner ................................................................ 150
Interação com o Utilizador usando o Scanner e o PrintWriter ............................ 151
Sumário ............................................................................................................... 152
Exercícios de autoavaliação ................................................................................ 153
Perguntas .................................................................................................... 153
Respostas.................................................................................................... 153
vi
UNIISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em
Java Exercícios para avaliação .................................................................................... 155
Exercícios do tema ........................................................................................................ 157
Exercícios de autoavaliação ................................................................................ 157
Perguntas .................................................................................................... 157
Respostas.................................................................................................... 161
Exercícios para avaliação .................................................................................... 178
Referências Bibliográficas ............................................................................................ 179
vii
UNIISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em
Java Exercícios para avaliação .................................................................................... 206
Referências Bibliográficas ............................................................................................ 208
viii
UNIISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em
Java Respostas: .................................................................................................. 239
Exercícios para avaliação .................................................................................... 240
Exercícios do tema ........................................................................................................ 242
Exercícios de autoavaliação ................................................................................ 242
Perguntas .................................................................................................... 242
Respostas.................................................................................................... 242
Exercícios de avaliação ....................................................................................... 243
Referências Bibliográficas ............................................................................................ 245
ix
UNIISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em
Java
x
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Visão geral
Objetivos do Módulo
Ao terminar o estudo deste módulo de Programação Avançada em
Java o estudante deverá ser capaz de: Compreender e Aplicar os
Pilares de Programação Orientada a objectos (encapsulamento,
abstração e polimorfismo), na conceção de Aplicações baseadas em
Java. Para tal deverá:
1
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Páginas introdutórias
▪ Um índice completo.
▪ Uma visão geral detalhada dos conteúdos do módulo,
resumindo os aspetos-chave que você precisa conhecer para
melhor estudar. Recomendamos vivamente que leia esta secção
com atenção antes de começar o seu estudo, como componente
de habilidades de estudos.
Outros recursos
A equipa dos académicos e pedagogos do ISCED, pensando em si,
num cantinho, recôndito deste nosso vasto Moçambique e cheio de
dúvidas e limitações no seu processo de aprendizagem, apresenta
uma lista de recursos didáticos adicionais ao seu módulo para você
explorar. Para tal o ISCED disponibiliza na biblioteca do seu centro
de recursos mais material de estudos relacionado com o seu curso
como: Livros e/ou módulos, CD, CD-ROOM, DVD. Para além deste
material físico ou eletrónico disponível na biblioteca, pode ter
acesso a Plataforma digital moodle para alargar mais ainda as
possibilidades dos seus estudos.
2
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Comentários e sugestões
Use este espaço para dar sugestões valiosas, sobre determinados
aspetos, quer de natureza científica, quer de natureza didático-
Pedagógica, etc, sobre como deveriam ser ou estar apresentadas.
Pode ser que graças as suas observações que, em gozo de confiança,
classificamo-las de úteis, o próximo módulo venha a ser melhorado.
Ícones de atividades
Habilidades de estudo
3
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
4
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Precisa de apoio?
Caro estudante temos a certeza que por uma ou por outra razão, o
material de estudos impresso, lhe pode suscitar algumas dúvidas
como falta de clareza, alguns erros de concordância, prováveis
erros ortográficos, falta de clareza, fraca visibilidade, página
trocada ou invertidas, etc). Nestes casos, contacte os serviços de
atendimento e apoio ao estudante do seu Centro de Recursos (CR),
via telefone, sms, E-mail, se tiver tempo, escreva mesmo uma carta
participando a preocupação.
Uma das atribuições dos Gestores dos CR e seus assistentes
(Pedagógico e Administrativo), é a de monitorar e garantir a sua
aprendizagem com qualidade e sucesso. Dai a relevância da
comunicação no Ensino a Distância (EAD), onde o recurso as TIC se
tornam incontornável: entre estudantes, estudante – Tutor,
estudante – CR, etc.
As sessões presenciais são um momento em que você caro
estudante, tem a oportunidade de interagir fisicamente com staff
do seu CR, com tutores ou com parte da equipa central do ISCED
indigitada para acompanhar as suas sessões presenciais. Neste
5
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Avaliação
1
Plágio - copiar ou assinar parcial ou totalmente uma obra literária, propriedade
intelectual de outras pessoas, sem prévia autorização.
6
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
7
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Introdução
Nas disciplinas de programação que precedem a disciplina de
Programação avançada (P1 e P2) foram introduzidos os conceitos
básicos da programação orientada a objetos. Sem dúvida ficou claro
que este paradigma de programação facilita, em muito, a vida do
programador.
Usando a Programação orientada a objetos (POO), os programas
tornam-se legíveis e fáceis de manter devido à flexibilidade que se tem
em introduzir modificações no código.
Nesta disciplina serão introduzidos conceitos avançados relacionados
com a técnica de programação orientada a objetos, estes, são conceitos
que quando bem aplicados trazem ganhos significativos ao processo de
desenvolvimento e manutenção de aplicações; estes são os chamados,
pilares da orientação a objetos! São eles: (1) Encapsulamento; (2)
Abstração e (3) Polimorfismo.
Porém, antes de avançar e aprofundar nestes conceitos, vamos fazer
uma breve revisão dos conceitos básicos de programação orientada a
objetos. Começaremos por contextualizar o conceito “objeto” em
programação bem como o conceito de classe de objetos. Mais tarde
será apresentada a abordagem aplicada em programação orientada a
objetos para depois debruçar-se um pouco mais nos elementos que
compõe uma classe de objetos. Para terminar apresenta-se os
mecanismos de aplicação de classe de objetos bem como a
manipulação dos elementos do objeto.
Ao completar esta unidade, você deverá ser capaz de:
9
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
específicos
Classe e Objeto
A programação orientada a objetos procura aproximar o código à
realidade que nos rodeia. Quando olhamos ao nosso redor vemos
objetos, esses objetos têm suas características, sua forma de estar e
propósitos específicos. No mundo real, os objetos encontram-se
agrupados em classes ou famílias de objetos; por exemplo:
eletrodomésticos, automóveis, telemóveis, etc.
Uma classe de objetos descreve as características comuns bem como as
habilidades (ou propósito) de cada objeto por ela representada. Na
figura 1 temos um exemplo de representação de classe de objetos. Note
que aqui lista-se algumas possíveis características que podem interessar
para descrever a classe de objetos em causa, o automóvel.
10
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
11
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Sumário
Nesta Unidade temática 1.1 fizemos a revisão dos conceitos classe e
objeto. Estes são conceitos básicos da programação orientada a objetos
e eles estão intrinsecamente ligados, na medida em que a classe
descreve múltiplos objetos de uma determinada família ou grupo e o
objeto é uma ocorrência específica de uma classe. Ficou claro que
programar usando estes conceitos garante maior consistência e
integridade de dados, visto que os mesmos são manipulados de forma
agrupada e controlada.
Exercícios de autoavaliação
Perguntas
1. Defina os seguintes conceitos classe e objeto.
2. Diferencie os Conceitos Classe e Objeto.
3. Agrupe os seguintes termos em Classe ou Objeto: carro,
avião, acidente de Mbuzine, cabo USB, Sr. Jota-Jota, conta
bancária da primeira dama de Jugoslávia, musica, carro
roubado ontem, único carro do meu vizinho da frente, a
12
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
14
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Introdução
Objectivos
específicos
15
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Suponha que que se pretenda criar uma aplicação que auxilie no cálculo
da área de um retângulo. Detalhe os passos necessários para criar a
aplicação em causa recorrendo a técnica de programação orientada a
objetos.
Sumário
Nesta unidade temática 1.2 foi apresentado de forma breve o processo
de criação de aplicações usando a técnica de programação a objetos.
São passos aparentemente simples, mas quando bem compreendidos
fornecem um instrumento forte para os programadores iniciantes.
Exercícios de autoavaliação
Perguntas
1. No processo de modelação de dados, o que é uma entidade?
2. Liste os passos a seguir no processo de programação
orientada a objetos;
3. Considere que se pretende criar uma aplicação que permite
calcular que idade determinado individuo tinha num
determinado ano. Detalhe os passos
16
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas:
1. Uma entidade é tudo aquilo sobre o qual se pretende captar,
armazenar, processar e difundir dados
2. (a) identificar as entidades e seus dados (b) criar as
respetivas classes de objeto (c) criar objetos e processar seus
dados usando suas rotinas.
3. Detalhe dos passos:
(a) Identificar as entidades envolvidas: neste caso, tratando-
se do calculo da idade de um individuo, a entidade
associada seria o Individuo. Para o cálculo da idade do
individuo interessa saber o ano em que o mesmo nasceu;
seria também necessário saber qual é o nome de tal
individuo; portanto, estes seriam os dados a agrupar2. A
operação sobre estes dados seria o cálculo da área que é
o produto entre a comprimento e a largura.
(b) Criar o descritor: trata-se da criação da classe de objetos
com seus elementos;
(c) Criar a aplicação: que no caso iria criar um objeto de tipo
individuo e de seguida calcular a idade usando a
operação disponibilizada para tal através deste objeto.
4. Em orientação a objetos os dados são manipulados pelo
próprio objeto;
5. A entidade principal seria “Estudante”, os seus atributos
seriam: nome, e as notas obtidas nas avaliações.
2
Note que para calcular a idade do individuo num determinado ano, precisaríamos
também de tal ano. Mas este não é um dado do individuo, trata-se de uma variável
externa que somente é necessária no momento do cálculo da idade.
17
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas: 1-F, 2-V, 3-V, 4-V, 5-F, 6-F, 7-V, 8-V, 9-V, 10-V.
Introdução
18
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
19
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Atributos
Conforme referido antes, os atributos descrevem as características de
todos os objetos representados pela classe de objetos. No caso da
classe Retângulo, os seus objetos são descritos por “comprimento” e
“largura”, isso significa que qualquer que seja o retângulo é descrito por
“comprimento” e “largura”; ou por outras: “todo e qualquer retângulo
tem comprimento e largura”. O atributo é definido por um par “tipo de
dados, identificador”. A este par pode se juntar o modificador de
visibilidade. No caso dos atributos do Retângulo, aplicou-se o
modificador “public” para o comprimento e “private” para a largura.
Um modificador de visibilidade define as regras de acesso ao atributo,
o modificador “public” permite acesso ao atributo quer dentro da classe
onde foi definido quer fora da mesma. Já o modificador “private”
permite acesso apenas a partir do interior da classe onde o atributo foi
definido. Para alem destes dois modificadores, existe também o
modificador “protected” que será tratado mais adiante.
Note o atributo “objetosCriados”! Este é ligeiramente diferente dos
outros dois devido a presença da palavra reservada “static”. Trata-se de
um atributo de classe em oposição de atributo de instância. Isso
significa que este atributo não faz parte das caraterísticas do Retângulo
e as instâncias do Retângulo não possuirão esta caraterística. Ao passo
que as variáveis de instância só existem em uma instância, as variáveis
da classe existem sem instância.
O construtor
O construtor é um método especial cuja função é a geração de objetos
(instâncias) da classe. O construtor diferencia-se dos restantes métodos
da classe (1) por usar o mesmo identificador que o da classe e (2) por
não apresentar o tipo de retorno na sua estrutura.
Todo e qualquer objeto (instância) é criado recorrendo a um construtor,
este pode ter sido definido explicitamente pelo criador da classe ou ser
implícito no caso de o criador da classe não incluir nenhum construtor,
neste último caso há possibilidade de se usar o construtor implícito, este
é um construtor que não recebe parâmetros.
Note que dentro da mesma classe de objetos pode se incluir vários
construtores desde que tenham parâmetros diferentes, quer em
quantidade quer em tipos de dados.
No exemplo do retângulo foi definido apenas um construtor o qual está
delimitado pelo número três na figura anterior.
Os métodos
Os métodos representam as habilidades dos objetos, isto é, aquilo que
os objetos são capazes de fazer. Normalmente, eles manipulam os
dados do objeto (valores dos atributos)
20
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
21
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Figura 5: Importação
Sumário
Nesta unidade temática 1.3 foram apresentados os elementos
fundamentais de uma classe de objetos, a saber, atributos, construtor e
métodos. Dentro de uma classe podem ser incluídos dois tipos de
atributos, os atributos de instância e os atributos de classe; o primeiro
representa as características dos objetos, o segundo trata-se de
variáveis auxiliares que podem ser usadas a partir da classe. Foi
22
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Exercícios de autoavaliação
Perguntas
1. Liste os elementos principais de uma classe de objetos;
2. Diferencie as variáveis de instância das variáveis de classe;
3. Diferencie os métodos de instância e os métodos de classe;
4. Qual é o propósito do construtor da classe?
5. Para que servem os modificadores de visibilidades?
6. Considere a entidade individuo mencionada no exercício 3
da unidade 1.2. Crie a classe para representar esta entidade
incluindo todos os elementos fundamentais da mesma.
Inclua também uma variável de classe para guardar a
quantidade de instâncias criadas e um método para imprimir
o valor desta entidade.
Respostas:
1. Atributos, construtores e métodos.
2. As variáveis de instância representam as características dos
objetos, elas são intrínsecas ao objeto, elas não existem sem
objeto! As variáveis de classe são variáveis próprias da
classe, elas existem sem instância;
3. Os métodos de instância representam habilidades dos
objetos ao passo que os métodos de classe são métodos
auxiliares e existem sem instância;
4. O construtor serve para criar instâncias da classe de objetos;
5. Os modificadores de visibilidade permitem definir as regras
de acesso aos elementos da classe;
6. Resposta
23
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
24
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Introdução
25
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Ao completar esta unidade temática 1.4, você deverá ser capaz de:
26
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Sumário
Nesta unidade temática 1.4 discutimos os mecanismos de instanciação
e acesso aos elementos da instância. Ficou claro que toda e qualquer
27
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Exercícios de autoavaliação
Perguntas
1. Como são criadas as instâncias de classe?
2. Diferencie “instância de classe” e “referência a instância”;
3. Qual é a diferença fundamental entre a invocação de
métodos/atributos de instância e métodos/atributos de
classe?
4. Como se deve proceder caso haja interesse no retorno da
invocação de um método sobre um objeto?
5. Considere a classe individuo criada no exercício 6 da unidade
1.3. Com base nesta classe, crie um programa que permite
calcular e visualizar a idade de um individuo nascido a 01 de
março de 1998. No mesmo programa, visualize a quantidade
de indivíduos criados.
Respostas:
1. As instâncias de classe são criadas recorrendo a um dos
construtores da classe. Normalmente uma instância é
associada a uma variável de referência.
2. Uma referência a instância é apenas uma variável que
“aponta” para a instância, ela não tem existência na
memoria, ao passo que a instância existe na memoria e
ocupa espaço;
3. Os métodos e atributos de instância só podem ser invocados
sobre uma instância de classe ao passo que os métodos e
atributos de classe são invocados sobre o nome da classe;
4. Sempre que houver interesse no retorno de um método
invocado sobre um objeto deve se armazenar esse retorno a
uma variável ou invocar o método em um contexto de
expressão.
5. Resolução
28
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
29
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas: 1-F, 2-V, 3-V,4-F, 5-F, 6-F 7-a, 8-b, 9-c, 10-c.
Exercícios do tema
Exercícios de autoavaliação
Perguntas
1. Qual é a essência de programação orientada a objetos?
2. Descreva os passos aplicados quando se programa orientado
a objetos;
3. Apresente e descreva os elementos de uma classe de
objetos;
30
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
habilidades/comportamento. Os
32
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
33
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
7. Resolução
34
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
35
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
36
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas: 1-c, 2-c, 3-c, 4-b, 5-a, 6-c, 7-c, 8-b, 9-b, 10-a.
Referências Bibliográficas
37
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
38
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Introdução
Definição
Encapsulamento é o mecanismo pelo qual um objeto isola os seus
dados bem como a lógica do processamento dos mesmos em relação às
classes que o manipulam. O encapsulamento visa garantir que os dados
do objeto serão manipulados de forma segura evitando situações de
inconsistência de dados que poderiam advir do manejamento incorreto
39
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
40
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
41
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
42
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Deve ficar claro que uma classe de objetos pode ser usada em vários
momentos, em vários pontos de um projeto e de vários projetos e não
está garantido que todos os que irão usar a classe conheçam as regras
sobre os dados. O encapsulamento garante que quem mexe com os
dados é o próprio objeto e não terceiros.
E como é conseguido o encapsulamento?
Encapsular, passa em primeiro lugar por inibir terceiros de mexer
diretamente com os dados “sensíveis” do objeto; por dados sensíveis,
entenda-se dados que só o próprio objeto conhece as regras para a sua
manipulação. Isso é conseguido tornando privados os atributos
sensíveis da classe de objetos e isso é feito recorrendo ao modificador
de visibilidade “private”, visto que este modificador garante que o
atributo só pode ser acedido a partir de dentro da classe de objeto dono
do atributo.
Vamos modificar a definição dos atributos da classe Stock, tornando-os
“private”.
Figura 15: Classe Stock com atributos sensíveis definidos como “private”
43
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
45
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Sumário
Nesta Unidade temática 2.1 estudamos e discutimos o princípio de
encapsulamento e suas vantagens. Este principio visa isolar a
complexidade das operações sobre os dados; está abordagem garante
que os dados são manipulados de forma correta pois a manipulação dos
mesmos é feita por quem melhor os conhece, o criador do descritor! O
encapsulamento garante:
46
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Exercícios de autoavaliação
Perguntas
1. Defina em poucas palavras o que é encapsulamento.
2. Qual é o propósito do encapsulamento?
3. Como se consegue o encapsulamento?
4. Quais são as vantagens do encapsulamento?
5. Considere o programa App02 apresentado na figura
seguinte.
a) Diga que efeitos, a instrução no retângulo 1, produz
sobre os atributos do objeto “stock” criado na linha 4 do
programa.
b) A instrução no retângulo 2 não produz nenhum efeito,
justifique porquê.
47
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
48
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
7. Resposta
49
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
8. Resposta
50
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
O método menu
51
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas: 1-V, 2-F, 3-F, 4-F, 5-V, 6-b, 7-c, 8-c, 9-a, 10-a
Introdução
52
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
O Problema
Suponha que se pretende desenvolver uma aplicação bancária para
auxiliar nas operações de um determinado banco. Suponha ainda que o
banco em causa fornece dois tipos de contas a saber, Contas a Ordem e
Contas a Prazo. Todas as contas possuem um número, titular e saldo. As
Contas a prazo possuem, para além dos atributos comuns, a data do
inicio da aplicação e a duração da aplicação. As Contas a Ordem
possuem, o regime de titularidade o qual pode ser cada um destes três:
individual, solidária ou conjunta. Toda vez que há um depósito numa
conta a prazo, o saldo é acrescido com um extra de 3% do valor do
depósito.
Usando as bases apresentadas até agora, para resolvermos este
problema criaríamos 2 classes de objetos, a classe ContaOrdem e
ContaPrazo. Em cada uma das classes teríamos 3 atributos, a saber:
número, titular e saldo.
Cada uma das classes teria as suas habilidades que por sinal são muito
parecidas, a saber: levantamento, deposito, transferência e impressão
da informação da conta.
Vamos imaginar que depois de termos o nosso sistema funcional, fosse
necessário acrescentar mais um atributo a cada uma das classes,
digamos, a data de abertura da conta. Seria necessário incluir em cada
uma das classes este novo atributo. E se tivéssemos que incluir o
método para calcular a “idade” da Conta? Com certeza teríamos de
adicionar este método em cada uma das classes.
Vamos imaginar ainda que fosse necessário introduzir uma validação
para o número da conta, por exemplo, vamos supor que o número da
conta deve ter exatamente 5 dígitos e que o último dígito é um dígito
de verificação baseado num algoritmo matemático qualquer. O código
de validação do número teria de ser introduzido em cada uma das duas
classes. E se no futuro quiséssemos corrigir ou melhorar o código de
53
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Definição
Herança é o mecanismo pelo qual uma classe (subclasse/descendente)
herda as características e habilidades de uma outra classe (superclasse).
Neste tipo de relacionamento, diz-se que a subclasse estende a
superclasse. A subclasse é comumente chamada “classe filha” e a
superclasse “classe mãe”.
O mecanismo de herança, aumenta os ganhos da programação
orientada a objetos, uma vez que permite que as características e
habilidades de determinadas classes de objetos sejam expandidas
(estendidas) sem necessidade de se “remexer” o que já existe. A classe
“filha” poderá acrescentar [a ela mesma] atributos e métodos, que não
foram contemplados na classe “mãe”; além disso, a classe “filha”
poderá reescrever algumas funcionalidades da classe “mãe”, isto é,
implementar novamente funcionalidades definidas na classe “mãe” de
tal maneiras a adequa-las às suas necessidades específicas.
Para estabelecer uma herança entre duas classes, usa-se a palavra
reservada extends.
Vamos resolver o problema levantado anteriormente usando o
mecanismo de herança. Primeiro vamos criar a classe mãe (a classe que
contêm todos os atributos e métodos comuns). Chamemos esta classe
de Conta. Depois iremos criar as classes filhas e nestas vamos
acrescentar os atributos e métodos a elas exclusivos.
A classe Conta [apresentada na figura 25] será a base para as restantes
contas. As classes “ContaOrdem” [figura 26] e “ClassePrazo” [figura 27]
irão estender esta classe.
Note o uso do modificador “protected” para os atributos da classe
“Conta”. Este modificador garante que o atributo (ou método) será
visível nas subclasses da classe onde foi
54
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
55
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
56
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Sobreposição/Reescrita(Overriding) de métodos
Reescrita ou sobreposição (overriding, em inglês) é o mecanismo pelo
qual uma subclasse reescreve métodos definidos na superclasse para
adequa-los às suas necessidades específicas.
Métodos reescritos devem ter mesma assinatura que os da superclasse,
isto é, o nome, os parâmetros e o retorno deve coincidir.
No caso da classe “ContaPrazo”, a diferença no método “depositar”
consiste no facto de este adicionar 3% extra ao saldo depois do
depósito.
Novamente, note o uso da palavra “super”. Neste caso o “super” é
usado para fazer referência a um método definido na superclasse, o
método “depositar” da classe “Conta”
57
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
58
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
“O toString”
O “toString” é um método definido na classe “Object” para fornecer a
descrição do Objeto por meio de uma String. Normalmente, essa
descrição é composta pelos valores dos atributos relevantes do objeto.
Este método tem a seguinte assinatura “public String toString ()”.
Vamos rescrever este método nas classes do nosso modelo
59
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
“O equals”
O “equals” é um método disponibilizado pela classe “Object” para
determinar se dois objetos são iguais ou não. O método “equals” da
classe “Object” retorna “true” se e somente se os dois objetos “forem
o mesmo objeto”, o que na maioria dos casos não é útil para casos
específicos; por essa razão, o método “equals” precisa ser reescrito.
Vamos reescrever o método “equals” na nossa superclasse “Conta”
Sumário
Nesta unidade temática 2.2 abordamos herança. Com base num
exemplo foi apresentada a necessidade do uso da herança. Ficou claro
que o uso da herança garante reutilização do descritor fornecendo uma
maneira transparente para novos descritores fazerem uso dos
elementos de um descritor “mãe” e evitando dessa forma repetição de
código. A herança é poderosa pois para além de permitir que as
subclasses herdem atributos e métodos da superclasse, permite às
subclasses reescrever os métodos da superclasse para adequa-los à
necessidades específicas.
Exercícios de autoavaliação
Perguntas
1. Defina o conceito herança;
2. Quais são os problemas que a herança se propões a
resolver?
3. O que significa “reescrita” de métodos e em que
circunstâncias fazemos uso dela?
4. Com base no modelo de classes criado nesta unidade
temática 2.2, elabore um programa que permite criar uma
um objeto do tipo ContaOrdem e outro do tipo ContaPrazo
(Os dados das contas devem ser lidos pelo teclado). Depois
da criação das contas efetue o seguinte:
a) Deposite 10,000.00 em cada uma das contas;
b) Visualize o saldo de cada uma das contas;
c) A que se deve a diferença dos saldos finais?
5. Suponha que se pretende desenvolver uma aplicação para
auxiliar na gestão de indivíduos envolvidos no processo de
formação da ISCED. Para esta aplicação, importa recolher e
processar os dados dos diferentes tipos de indivíduos que
participam dos processos acadêmicos, nomeadamente:
estudantes, docentes e coordenadores
61
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
62
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
63
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
64
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
6. (c)
65
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
9. Em orientação a objectos:
a) Todo e qualquer objeto pode invocar o método “equals”
visto que a superclasse Object implementa este método;
b) Toda e qualquer classe de Objectos possui um construtor
sem parâmetros;
c) Todo e qualquer método de uma classe de objectos pode
ser invocado sobre todo e qualquer objeto dessa classe.
10. Se uma superclasse define um método como “private”, a
subclasse poderá reescrever este método como public.
a) Não, porque métodos privados não podem ser
reescritos;
b) Sim, porque a subclasse pode modificar tal método para
se adequar às suas necessidades;
c) Nenhuma opção está correta.
Respostas: 1-F, 2-F, 3-V, 4-F, 5-F, 6-a, 7-b, 8-b, 9-a, 10-a
Introdução
67
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
O problema
Considere o modelo de classes apresentado na unidade temática 2.2. O
modelo em causa é composto por três classes de objetos,
nomeadamente, a superclasse Conta, e as subclasses ContaOrdem, e
ContaPrazo.
Vamos dotar as nossas classes de capacidades de persistência de dados
em ficheiro: a saber (1) descarregamento de dados do objeto no ficheiro
e (2) carregamento dos dados do objeto a partir do ficheiro. Vamos
incluir dois métodos na superclasse Conta, o método
“unloadToCurrentLineOfFile” que descarrega os dados da conta no
ficheiro e o método “loadFromCurrentLineOfFile” que recupera os
dados do objeto a partir da linha corrente do ficheiro. Vamos ainda
incluir um método que permite fazer um “clone” da conta, chamaremos
esse método “clone”. Uma vez que as subclasses da classe Conta
possuem algumas particularidades, iremos rescrever os métodos
mencionados nas subclasses ContaOrdem e ContaPrazo3.
Nas figuras seguintes estão representadas as classes mencionadas
anteriormente. Note que alguns elementos destas classes foram
omitidos, mas eles podem ser encontrados em detalhe na unidade
temática 2.2.
3
O manejo de ficheiros está fora do contexto desta unidade. Caso não tenha
conhecimentos relacionados com o acesso e escrita de dados em ficheiros de texto
considere fazer leitura da unidade III.
68
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
69
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
70
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
71
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Figura 42: Criação e manipulação dos objeto do tipo "ContaOrdem" e "Conta Prazo"
Visitando os ficheiros criados notamos que o conteúdo dos mesmos é
semelhante ao que está apresentado na figura abaixo.
72
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Definição
Polimorfismo é a capacidade de um objeto poder ser referenciado de
várias formas. No nosso exemplo referimo-nos a “conta a prazo” como
“conta”. Afinal toda a “conta a prazo” é também uma “conta”!
E qual será o resultado da invocação do método “depositar” em
destaque no ponto 2? O resultado será o incremento de 3% do valor do
depósito ao saldo conforme definido na classe ContaPrazo! Isso soa
estranho pois estamos a invocar o método sobre uma variável do tipo
Conta! Mas dissemos antes que esta variável faz referência a um objeto
do tipo ContaPrazo, logo, o método invocado será o definido nesta
classe (ContaPrazo).
O polimorfismo adiciona poder à programação orientada a objetos!
73
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Benefícios do polimorfismo
Considere que se pretende criar uma aplicação bancária com
mecanismos de persistência de dados de contas bancárias em ficheiros
de texto. Para além dos métodos habituais de processamento de
operações bancárias (para a criação de contas, depósitos,
levantamentos, transferência e consulta) precisaríamos de métodos
para escrever/atualizar dados no ficheiro e recuperar dados do ficheiro.
Vamos chamar estes métodos respetivamente de “saveToFile”,
“updateOnFile” e “loadFromFile”. Para tornar o entendimento fácil, a
aplicação em causa ira criar duas contas [ContaOrdem e ContaPrazo],
armazena-las no ficheiro, de seguida irá recuperar as contas, depositar
1000 em cada uma delas e finalmente atualizar os dados no ficheiro.
Cada conta será registada no seu respetivo ficheiro.
A seguir são apresentados os métodos desta aplicação; primeiro
apresenta-se o “main” e métodos relacionados, mais adiante o detalhe
dos métodos “saveToFile”, “updateOnFile” e “loadFromFile”.
74
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
4
O “null” é o mesmo que vazio!
76
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
O polimorfismo – a conclusão
Até aqui foi apresentado o conceito polimorfismo.
Polimorfismo é um conceito que se aplica entre uma classe e suas
subclasses. As instâncias das subclasses podem ser referenciadas por
variáveis de superclasse, o oposto não é possível.
O polimorfismo permite abstrair funcionalidades para classes
inicialmente não existente. Por exemplo, no problema tratado
anteriormente criamos o método “saveToFile” cuja sua função é
armazenar os dados de uma conta no ficheiro; no entanto, cada tipo de
conta pode ter o seu formato de armazenamento de dados, mesmo
assim, este método continua a funcionar para todos eles. Se no futuro
surgirem novos tipos de instância, os mesmo poderão ser tratados por
este método sem a necessidade de o método ser remexido. Sem
polimorfismo teríamos de criar um método “saveToFile” para cada tipo
de conta existente!
77
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
78
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
79
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
80
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Interface
Até aqui foram apresentados os conceitos relacionados com herança,
suas vantagens e a possibilidade que ela nos dá de aplicar polimorfismo.
81
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
82
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
83
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
84
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
85
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Figura 53: Interface "Gravável" que abstrai qualquer objeto gravável em ficheiro
86
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Figura 56: Instância de Stock e ContaOrdem sendo referenciados por variáveis do tipo
Gravavel
87
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
88
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Sumário
Nesta unidade temática 2.3 estudamos com alguma profundidade mais
dois pilares da programação orientada a objetos, nomeadamente,
polimorfismo e abstração. Vimos que a abstração é um conceito chave
para a construção de aplicações fidedignas e de fácil leitura. Tal é
conseguido tornando o acesso aos atributos da classe de objetos
restrito e controlado. Usando o
89
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Exercícios de autoavaliação
Perguntas
1. Justifique a necessidade do uso do encapsulamento.
2. Defina o conceito abstração em programação orientada à
objetos;
3. Defina o conceito polimorfismo.
4. O que é uma classe abstrata e quais problemas resolve?
5. O que é uma interface e que vantagens as mesmas
introduzem no processo de programação?
Respostas:
1. O encapsulamento é um conceito através do qual os
programas são organizados de tal maneira que os dados
90
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
92
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas: 1a, 2b, 3a, 4b, 5a, 6b, 7c, 8b, 9c, 10b
Execícios do Tema
Exercios de autoavaliação
Perguntas
1. Relacione os conceitos abstração e polimorfismo;
2. Quais são os benefícios que advém do uso de abstração e
polimorfismo?
3. Justifique a necessidade do uso de classes abstratas;
4. Crie uma classe de objetos [“Estudante”] para representar o
estudante na cadeira de Programação Avançada em Java; a
classe em causa deverá implementar a interface
[“Gravável”] apresentada na unidade 2.3. Suponha que o
estudante é descrito por: código, nome completo, e notas de
três avaliações [teste 1, teste 2 e trabalho]. A classe em
causa deverá ter as seguintes características:
• Um construtor com 5 parâmetros representando os
atributos da classe;
93
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
94
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas
1. O polimorfismo é a capacidade de um mesmo objeto poder ser
referenciada de múltiplas formas, já a abstração é uma técnica
de programação que procura criar independência entre os
objetos na medida em que é possível conceber uma solução sem
se preocupar com características específicas de um objeto. Ora
a abstração usa do polimorfismo para garantir a desamarração
entre objetos.
2. O uso do polimorfismo e abstração permite conceber soluções
capazes de resolver problemas do futuro.
3. O uso de classes abstratas garante que determinadas classes
não possam ser instanciadas ou mesmo tempo que permite a
inclusão de métodos abstratos; esta última característica é
benéfica para a abstração.
4. A classe estudante
95
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
96
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
97
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
98
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
99
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
100
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
101
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
102
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
103
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas: 1b, 2b, 3b, 4a, 5a, 6b, 7b, 8b, 9c, 10a, 11c, 12b
Referências Bibliográficas
104
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Introdução
No mundo real, as aplicações interagem com o usuário através de
apresentação de mensagens bem como receção de respostas ou
entradas feitas pelo utilizador. Além disso, as aplicações precisam
persistir dados para futuras consultas bem como recuperar dados
persistidos para novos processamentos. Persistência de dados consiste
em armazenar dados de forma permanente em disco em oposição ao
armazenamento temporário em memoria. Os dados armazenados na
memoria temporária são perdidos quando a aplicação é encerrada daí
a necessidade de persistir os dados de forma permanente. Em java, os
Streams fornecem mecanismos para a persistência e recuperação de
dados em ficheiros. Neste tema serão apresentados diferentes tipos de
Streams e sua utilidade a qual passa desde a entrada de dados usando
dispositivos periféricos, armazenamento de dados em ficheiros planos,
até ao armazenamento de objetos em ficheiros.
Ao completar esta unidade temática 3.1, você deverá ser capaz de:
105
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Sumário
Nesta unidade temática 3.1 introduzimos a persistência de dados e
listamos alguns Streams disponibilizados pelo JAVA para a manipulação
de ficheiros, nomeadamente FileInputStream e FileOutputStream,
FileReader e FileWriter, BufferedReader e BufferedWriter,
ObjectInputStream e ObjectOutputStream e ObjectInputStream e
ObjectOutputStream.
106
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Exercícios de autoavaliação
Perguntas
1. O que entendes por persistência de dados?
2. O que são “Streams” do java?
3. Liste alguns “Streams” disponibilizados pelo java.
4. Qual é o propósito dos Streams do tipo “File Stream”?
5. Quais são os Streams indicados para a persistência de dados
em ficheiros de texto?
Respostas:
1. Persistência de dados é o mecanismo pelo qual as aplicações
armazenam de forma permanente os dados captados e ou
processados para posterior uso.
2. Streams são classes que permitem a transferência de dados
entre diferentes dispositivos.
3. Streams disponibilizados pelo java:
a) FileInputStream e FileOutputStream;
b) FileReader e FileWriter;
c) BufferedReader e BufferedWriter;
d) ObjectInputStream e ObjectOutputStream
e) BufferedInputStream e BufferedOutputStream
4. Os Streams do tipo “File Stream” servem para persistir dados
em ficheiros binários.
5. Os Streams responsáveis pela persistência em ficheiros de
texto são FileReader e FileWriter.
107
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Introdução
108
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
109
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
5
Cada Sistema operativo possui uma codificação específica para separar linhas. Por
exemplo, o Sistema operative Windows usa a codificação ‘\r\n’ para separar linhas, o
linux usa ‘\n’. O uso da propriedade “line.separator” garante que o código será
independente do Sistema operative uma vez que nao se amarra a uma codificação
específica.
110
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
111
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Sumário
Nesta unidade temática 3.2 apresentamos os mecanismos de
manipulação de ficheiros de texto usando FileWriter e FileReader.
Trata-se de classes que permitem escrever e ler de ficheiros de texto.
113
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Exercícios de autoavaliação
Perguntas
1. Para que tipo de ficheiros se indica o uso de FileReader e
FileWriter?
2. Descreva o processo de escrita de dados no ficheiro usando
FileWriter;
3. Descreva o processo de leitura de dados contidos no ficheiro
usando FileReader.
4. Qual é a importância do uso do método “close” sobre um
FileWriter?
5. Crie um programa que permite escrever 5 linhas em um
ficheiro de texto. Cada linha deverá conter a operação de
soma de 2 números a sua escolha.
6. Cria um programa que permite recuperar e visualizar o
conteúdo do ficheiro criado no exercício anterior.
Respostas
1. FileReader e FileWriter são indicados para ficheiros do tipo
texto, isto é, ficheiros legíveis para o ser humano.
2. Para escrever dados em ficheiro usando FileWriter, primeiro
instancia-se a classe FileWriter usando um dos seus
construtores; o construtor obriga sempre a indicação do
ficheiro em que se pretender escrever dados; de seguida,
usa-se o método “write” para escrever os dadospretendidos;
no final, invoca-se o método “close” sobre a instância de
FileWriter para fechar o ficheiro.
3. Para ler dados em ficheiro de texto usando a classe
“FileReader”, primeiro instancia-se a classe FileReader
usando um dos construtores desta classe; o construtor exige
sempre a indicação do ficheiro que se pretende ler; de
seguida faz se a leitura do dado corrente usando o método
“read”.
4. O método “close” permite fechar o ficheiro e liberá-lo para
uso por outras aplicações.
5. Resolução
114
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
6. Resolução
116
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas: 1-c, 2-c, 3-b, 4-c, 5-a, 6-b, 7-c, 8-c, 9-b, 10-a.
Introdução
À semelhança das classes FileReader e FileWriter, as classes
BufferedWriter e BufferedReader permitem escrever e ler em ficheiros
de texto, no entanto estas classes permitem trabalhar com cadeias de
caracteres ao invés de carateres simples. Além disso estas classes fazem
parte de um grupo de Streams chamados “buferizados” (buffered) os
quais fornecem mecanismos mais eficientes de acesso aos ficheiros.
Nesta unidade temática 3.3 vamos estudar a essência destas classes na
117
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
118
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
119
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
120
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Figura 77: Criação de pauta com base em dados armazenados em ficheiro de texto
121
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
122
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Note que neste exemplo criamos dois “buffers” um para ler o ficheiro
original e outro para escrever no ficheiro temporário [ponto 2]. O
algoritmo usado para atualizar o ficheiro consiste na leitura do ficheiro
original usando o buffer “reader” e verificar se o estudante na linha
corrente corresponde ao estudante que pretendemos atualizar; caso
seja, modificamos os dados da linha corrente para os novos dados.
Sumário
Nesta unidade temática 3.3 apresentamos os mecanismos de
manipulação de ficheiros de texto usando BufferedReader e
BufferedWriter. Começamos por explicar a particularidade de Streams
“buferizado”. Fomos ao fundo apresentando mecanismos de resolução
de problemas envolvendo ficheiros de texto. E finalmente
apresentamos um algoritmo para a atualização de ficheiros de texto
usando estas duas classes, a classe BufferedReader e BufferedWriter.
Exercícios de autoavaliação
Perguntas
1. Explique a diferença entre Streams “buferizados” e Streams
não “buferizados”.
2. Quais são as vantagens do BufferedReader sobre o
FileReader?
3. Descreva um algoritmo para a atualização de um ficheiro de
texto recorrendo ao BufferedReader e BufferedWriter;
4. Para que server o método “split” da classe String e como ele
é útil no manejo de dados de ficheiros de texto?
5. Quando se deve usar o método “flush” do BufferedWriter?
6. Crie um programa que lê, pelo teclado, uma lista de nomes
de estudantes e armazena-os num ficheiro de tipo texto.
124
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
125
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas:
1. Usando Streams não “buferizados”, cada operação de leitura
ou escrita em ficheiro é tratada a nível do sistema operativo,
isto é, a nível do disco. Os Streams “buferizados” trabalham
a nível da memória em uma área conhecida como “buffer”,
trata-se de uma área intermédia entre a aplicação e o disco.
Nesta abordagem o acesso ao disco físico só é feito quando
requerido, normalmente quando o “buffer” estiver vazio (no
caso de leitura de dados) ou quando “buffer” estiver cheio
(no caso de escrita de dados).
2. O BufferedReader oferece mecanismos mais flexíveis de
leitura de ficheiro de texto uma vez que permite leitura de
linhas, além disso, a leitura de ficheiro usando
BufferedReader é relativamente mais rápida.
3. O algoritmo usado para atualizar o ficheiro consiste na
leitura iterativa do ficheiro original usando BufferedReader
da primeira linha até a última linha escrevendo o conteúdo
do ficheiro original num ficheiro temporário. A cada
interação verifica-se o registo na linha corrente corresponde
ao registo que pretendemos atualizar. Caso seja, modifica-
se os dados da linha corrente para os novos dados antes de
escrever a linha corrente no ficheiro temporário. No final,
remove-se o ficheiro original e renomeia-se o ficheiro
temporário para o nome do ficheiro original.
4. O método “split” permite dividir uma string em partes dado
o caracter (ou caracteres de separação). Este método é
bastante útil no processo de recuperação de dados
armazenados em ficheiro de texto em que os registos ficam
armazenados em linha visto que permite a decifração dos
dados do registo.
5. O método “flush” deve ser usado para confirmar a
persistência dos dados correntes no ficheiro.
6. Resolução
126
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
7. Resolução
127
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
128
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
129
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
130
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
131
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas: 1c, 2a, 3b, 4b, 5c, 6c, 7c, 8a, 9b, 10a
132
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Introdução
6
Note o uso da constante “File.separator”! Esta constante indica o
separador de diretórios do sistema operativo. O uso desta constante é
mais indicado em relação ao uso de separador específico para um sistema
operativo, pois garante maior portabilidade das aplicações uma vez que
o mesmo é dinâmico e fornecerá o separador apropriado para cada
sistema operativo.
134
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Sumário
Nesta unidade temática 3.4 apresentamos os mecanismos de
manipulação de ficheiros binários usando FileInputStream e
FileOutputStream. Trata-se de classes que permitem a transferência de
dados binários entre ficheiros ou entre aplicativos.
135
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Exercícios de autoavaliação
Perguntas
1. Explique a necessidade do uso de Byte Streams?
2. Dê exemplos de Bytes Streams;
3. Descreva o processo de transferência de dados com
FileInputStream e FileOutputStream.
4. Explique a diferença entre os métodos “read()” e
“read(byte[] buffer)” da classe FileInputStream.
5. Crie um programa que permite transferir os dados de
ficheiro do tipo mp3 para outro. Para a leitura do ficheiro
origem use o método “read (byte [] buffer)”
Respostas
1. Os Byte Stream são usados para a transferência de dados
binários entre aplicativos;
2. FileOutputStream e FileInputStream;
3. O processo de transferência de dados entre ficheiros
começa pela associação dos ficheiros aos Streams,
nomeadamente, o FileOutputStream ao ficheiro que se
pretende escrever os dados e o FileInputStream ao ficheiro
do qual se pretende ler os dados. A seguir por meio de um
ciclo “while” varre-se o ficheiro origem. A cada iteração
primeiro lê-se do ficheiro origem e depois escreve-se no
ficheiro destino o byte corrente e de seguida lê-se o próximo
byte usando o método “read”.
4. O método “read ()” lê e retorna o byte corrente. O método
“read (byte [] buffer)” lê múltiplos bytes de uma única vez e
os transfere para o “buffer” passado pelo parâmetro.
5. Resolução
136
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
137
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
138
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Introdução
139
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
140
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Exemplo
Crie um programa que permite persistir múltiplas instâncias de Pessoa
em um ficheiro de objetos. O programa deverá permitir também
recuperar do ficheiro uma pessoa dado o seu código. Para tal use como
base o descritor de Pessoa apresentado na figura seguinte.
141
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Resolução
142
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Sumário
Nesta unidade temática 3.5 estudamos o processo de serialização e de-
serialização de objetos. Trata-se de um processo que permite a
transferência de objetos por meio de Streams binários. Nesta unidade
temática abordamos essencialmente o processo de persistência e
recuperação de objetos em ficheiros binário recorrendo as classes
ObjectOutputStream e ObjectInputStream. Do ponto de vista de
codificação o uso destas classes torna o processo de persistência e
recuperação de dados mais simples e transparente, no entanto em
termos de performance os resultados não são animadores visto que
este processo é bastante lento e, portanto, desaconselhado em
aplicações de média e grande dimensão.
144
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Exercícios de autoavaliação
Perguntas
1. Explique o que é serialização e de-serialização;
2. Qual é o requisito para a serialização de uma instância de
classe com uso ao ObjectOutputStream?
3. Qual é o requisito para a de-serialização de um objeto
contido num ficheiro com recurso a ObjectInputStream?
4. Por que razão o uso de ficheiros de objetos é
desaconselhado?
5. Elabore um programa que permite armazenar e recuperar
de um ficheiro de objetos instâncias de Conta bancária.
Suponha que cada conta bancária seja descrita pelos
seguintes atributos: número, titular e saldo. O programa
deverá fornecer as seguintes funcionalidades:
• Criar conta e armazena-la no ficheiro;
• Recuperar e visualizar do ficheiro uma conta
bancaria dado o seu número;
Respostas:
1. O processo de serialização é o processo pelo qual o estado
corrente de um objeto é transformado em bytes de modo a
permitir a sua transferência usando Streams. A serialização
envolve sempre uma instância e a classe de objetos a que tal
instância pertence. O processo de recuperação de instância
de uma classe de um ficheiro é conhecido como de-
serialização e consiste na conversão de bytes [armazenados
em disco] em uma instância de classe.
2. Para que um objeto seja serializado usando o
ObjectOutputStream, a classe a que pertence deve
implementar a interface “Serializable”.
3. Para que um objeto seja de-serializado usando o
ObjectInputStream, a classe a usar para o processo deve ser
serializável, isto deve implementar a interface “Serializable”,
além disso esta classe deve ser exatamente a mesma usada
para o processo de serialização deste objeto.
4. O uso de ficheiros de objetos é desaconselhado por
comprometer a performance das aplicações.
5. Resolução
A solução para este problema é composta por duas classes, a classe do
modelo (Conta) que esta representada mais abaixo e a classe
aplicacional (App03_05_04); note que primeiramente apresenta-se o
esqueleto desta classe e mais adiante apresentam-se os métodos da
classe.
145
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
146
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
147
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
148
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
149
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Introdução
150
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
151
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
apenas o primeiro
“token” ou palavra
caso o utilizador
forneça um texto
com mais de uma
palavra.
nextLine() String Obtém uma String
pelo teclado. Note
que este método
permite ler uma
linha inteira
diferentemente do
método “next()” que
lê apenas a primeira
palavra.
nextBoolean boolean Obtém um boolean
pelo teclado
nextByte byte Obtém um byte pelo
teclado
nextInt int Obtém um int pelo
teclado
nextLong long Obtém um long pelo
teclado
nextFloat float Obtém um float pelo
teclado
nextDouble Obtém um double
pelo teclado
Note que [para os métodos que obtém pelo teclado valores de tipos de
dados primitivos] uma exceção será rebentada caso pelo teclado se
especifique um valor de tipo de dados incompatível.
152
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Sumário
Nesta unidade temática 3.6 estudamos os mecanismos de interação do
utilizador com os programas. Basicamente este processo é conseguido
recorrendo aos Streams “InputStreamReader” e “PrintWriter”. O
“PrintWriter” permite a visualização
153
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Exercícios de autoavaliação
Perguntas
1. Explica como os programas interagem com o utilizador;
2. Em java quais são as classes usadas para a iteração com o
utilizador;
3. Qual é a forma rápida disponibilizada pelo java para o acesso
às instâncias das classes mencionadas no ponto anterior?
4. Explica a relação entre a classe Scanner e a classe
“InputStreamReader”?
5. Modifique o programa apresentado no tópico “Interação
com o Utilizador usando o Scanner e o PrintWriter” de
modo a usar conceitos de orientação a objetos.
Respostas
1. A interação dos programas com o utilizador é feita através
da visualização de mensagens ao utilizador e mecanismos
que permitem com que este informe dados aos programas
pelo teclado ou pelo mouse.
2. “PrintStream” para visualização de dados e
“InputStreamReader” para a leitura de dados.
3. System.out e System.in, respetivamente.
4. A classe “Scanner” é um “wrapper” da classe
“InputStreamReader”; um scanner usa internamente um
“InputStreamReader” para disponibilizar mecanismos de
leitura de dados pelo teclado.
5. Resolução
A solução para este problema é composta por duas classes, a saber, a
classe “Individuo” que representa a entidade do sistema e a classe
App03_06_06 que representa a aplicação.
154
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
155
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
156
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
157
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas: 1c, 2c, 3c, 4a, 5c, 6c, 7a, 8a, 9b, 10b.
Exercícios do tema
Exercícios de autoavaliação
Perguntas
1. Suponha que os dados da venda de um produto estão
armazenados num ficheiro de texto, conforme ilustrado na
figura abaixo (onde a primeira linha representa o nome do
produto, a segunda linha representa a quantidade e a
terceira linha representa o preço unitário).
158
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
159
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
160
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
161
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Exercicío 1
162
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
163
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Exercício 2
Exercício 3
164
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
165
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
166
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
167
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
168
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
169
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
170
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
171
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
172
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
173
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
174
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
175
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
176
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
177
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
178
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
1b, 2c, 3a, 4c, 5a, 6c, 7c, 8b, 9b, 10a
Referências Bibliográficas
181
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Introdução
O conceito Generics é um conceito que adiciona poder à linguagem de
programação JAVA; trata-se de um conceito que, conforme veremos ao
longo deste capítulo, reduz a possibilidade de introdução de
inconsistências e erros nos nosso programas bem como flexibiliza o
processo de programação. O conceito Generics é um conceito
relativamente novo na linguagem JAVA, porém tem sido empregado em
diversas aplicações de média e grande porte na medida em que o
mesmo aparece associado ao Collection Framework que é uma
poderosa API do JAVA. Nesta unidade temática iremos introduzir o
conceito Generics apresentando as suas vantagens e a forma como o
mesmo é conseguido; iremos ainda apresentar a sua definição e
exemplos relacionados.
Ao completar esta unidade temática 4.1, você deverá ser capaz de:
183
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
184
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Note o uso de colchetes (<>) e a letra “T”. Neste caso “T” entra como
parâmetro para a classe e pode ser referenciado como tipo ao longo da
classe. Note que a letra “T” pode ser substituída por qualquer outra
letra embora a boa prática convencione que se use as letras de acordo
com o tipo de parâmetro que se pretende usar, a saber: (1) “E” para
elementos (2) “K” para chaves (3) “N” para números (4) “T” para tipos
(5) “V” para valores.
Agora, vamos reescrever o nosso MotorDePersistencia como tipo
genérico.
185
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
186
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
187
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Métodos Genéricos
À semelhança de classes, é possível introduzir parâmetros genéricos a
métodos. O trecho de código seguinte ilustra uma classe que faz uso de
um método genérico.
188
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Sumário
Nesta unidade temática 4.1 introduzimos o conceito Generics. Trata-se
de um conceito largamente usado junto com o polimorfismo e
abstração. Os tipos de dados genéricos reduzem a possibilidade de
erros relacionados com incompatibilidade de dados em programas
complexos na medida em que garante que estes tipos de erros sejam
identificados ainda em tempo de codificação.
Exercícios de autoavaliação
Perguntas
1. O que é um tipo de dados genérico?
2. Como é criado um tipo de dados genérico?
3. Como se instancia um tipo de dados genérico?
4. Quais são as vantagens do uso de Generics?
5. O trecho de código abaixo, não compila, justifica porquê?
Respostas
1. Um tipo genérico é uma classe que permite na sua definição
a passagem de tipos de dados por meio de parâmetros. Estes
parâmetros são usados para garantir que o uso de
polimorfismo seja mais seguro na medida em que permite
que uma classe que trabalha com polimorfismo possa definir
a cada momento que tipo de dados é suportado.
2. Uma classe genérica na sua definição inclui em colchetes
(<>) o tipo de dados que representa o parâmetro, este
parâmetro aparece imediatamente a seguir ao identificador
da classe.
3. A Instanciação um tipo de dados genérico é feita do mesmo
jeito como se instancia um tipo normal, a única diferença é
que no tipo genérico deve-se passar entre colchetes o tipo
específico representando o parâmetro.
189
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
190
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Introdução
A herança é um conceito da linguagem JAVA que adiciona poder a
linguagem; este conceito foi tratado de forma exaustiva no tema II.
Interface é outro conceito que aparece lado a lado com herança e juntos
formam as bases para o polimorfismo e a abstração. Nesta unidade
temática, introduzimos o conceito herança e interface associados aos
tipos de dados genérico. A herança com tipos de dados genéricos é
ligeiramente diferente da herança tradicional daí a importância de se
debruçar sobre este conceito.
Ao completar esta unidade temática 4.2, você deverá ser capaz de:
191
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
7
A herança pode ser ainda conseguida implementado uma interface genérica
192
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
193
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
194
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Sumário
Nesta unidade temática 4.2 abordamos os subtipos de tipos genéricos.
Um subtipo de tipo genérico pode ser conseguido por meio de herança
com tipos genéricos ou por meio da implementação de interface
genérica.
Exercícios de autoavaliação
Perguntas
1. Explica como podem ser criados subtipos de tipos genéricos;
2. Como são criadas interfaces genéricas?
3. Existirá alguma diferença entre interfaces genéricas e
interfaces tradicionais? Se sim, quais?
4. Será possível aplicar o conceito de polimorfismo com tipos
genéricos? Se explica como.
5. Supondo que Carro implementa Automóvel, a instrução
“List<Automovel> list = new ArrayList<Carro>();” estaria
correta? Justifique.
Respostas
1. A herança entre tipos genéricos pode ser conseguida de duas
formas: (1) estendendo a classe genérica passando pelo
parâmetro um tipo específico; (2) definindo a classe como
genérica e estendendo ao mesmo tempo a classegenérica;
2. A interface genérica é definida com a indicação de
parâmetro no fim do identificador da interface.
3. Sim, existe diferenças, dentre elas: (1) a definição de
variáveis de interface genérica é acompanhada pelo
parâmetro correspondente. (2) as interfaces genéricas
aceitam entrada de parâmetro na sua definição.
4. Sim, é possível e aplica-se da mesma forma que com os tipos
normais. Variáveis de superclasses podem ser usadas para
fazer referência a instâncias das subclasses.
5. Não! Pois ArrayList<Carro> não é subtipo de List<
Automovel>.
195
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
b) Falso;
c) Nem verdadeiro, nem falso.
7. Qual das seguintes afirmações é correta?
a) Os parâmetros em tipos genéricos alargam o
polimorfismo;
b) Os parâmetros em tipos genéricos garantem uso seguro
de polimorfismo;
c) As duas opções anteriores estão corretas.
8. Uma subclasse de uma classe genérica é também uma classe
genérica.
a) Sim, sempre;
b) Sim, às vezes;
c) Não, nunca.
9. No código apresentado mais abaixo, qual é o tipo de retorno
da chamada ao método “doJob” na linha 6?
a) Conta;
b) ContaOrdem;
c) T.
197
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas: 1c, 2b, 3a, 4a, 5b, 6a, 7c, 8b, 9b, 10c.
Introdução
O tema Generics é bastante vasto e contem tópicos bastante avançados
e alguns complexos. Este capítulo pretendia apenas fazer uma
introdução do tema Generics para fornecer as bases para o tema 5 que
trata sobre coleções parametrizadas. No entanto vamos nesta unidade
temática 4.3 apresentar ao alto alguns tópicos que poderá encontrar
em volta de Generics.
Ao completar esta unidade temática 4.3, você deverá ser capaz de:
198
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
“Wildcard”
Em Generics, “wildcard” permite representar uma classe genérica ao
nível da superclasse “Object”. Isto é, um “wildcard” permite que uma
determinada classe genérica possa ser usada para referenciar qualquer
instância de qualquer outro tipo daquela classe genérica. Os “wildcard”
são criados recorrendo ao parâmetro “<?>”; este parâmetro é
conhecido como “tipo desconhecido” e pode representar qualquer tipo
de dados. Abaixo temos um exemplo de aplicação de “wildcard”.
199
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
200
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
201
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
202
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Sumário
Nesta unidade temática 4.3 trouxemos alguns conceitos que poderão
ser encontrados em volta do tema Generics. São conceitos avançados e
que contribuem para a criação de aplicações com largo espetro de
abrangência. São eles, os “Wildcards”, uso de “Múltiplos parâmetros” e
“Tipos brutos”. Sem dúvidas, além destes conceitos poderá encontrar
outros que estão fora do âmbito deste manual.
Exercícios de autoavaliação
Perguntas
1. Qual é o número máximo de parâmetros que se pode definir
em uma classe genérica?
2. O que é um tipo bruto;
3. Existe alguma vantagem em usar tipos brutos;
4. Explica porque razão os tipos brutos são desaconselhados?
5. Explica em que circunstâncias se indica o uso de “wildcards”
e em que circunstâncias se indica o uso de tipos genéricos.
Respostas
1. Não existe uma quantidade definida para a quantidade de
parâmetros em tipos de dados genéricos.
2. Tipos brutos é o nome que se dá aos tipos genéricos quando são
referenciados sem parâmetros.
3. Sim! Garante a continuidade de sistemas legados.
4. O uso de tipos brutos anula todas as vantagens de tipos genéricos
pois possibilita o uso de múltiplos tipos de objetos como
parâmetro aos métodos de uma classe parametrizada.
5. Um tipo de dados parametrizado, é indicado na criação de
métodos cujos parâmetros de entrada estão diretamente
relacionados com o tipo de dados de retorno. Os métodos com
wildcard, são indicados para situações em que o parâmetro de
entrada não tem nenhuma relação com o tipo de dados de retorno.
203
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
204
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas: 1c, 2c, 3b, 4c, 5c, 6c, 7b, 8b, 9a, 10a.
205
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Exercícios do tema
Exercícios de autoavaliação
Perguntas
1. O que é um tipo genérico e como o mesmo é definido?
2. Justifique a necessidade do uso de tipos genéricos.
3. O que é um tipo de dados bruto? Explique em que
circunstâncias usarias este tipo de dados.
4. Sugira um problema em que achas que faria sentido usar um
tipo de dados genérico (seja classe ou interface).
5. Discuta o tema “Subtipos de tipos genérico”.
Respostas
1. Um tipo genérico é um tipo que na sua definição inclui um
parâmetro de entrada. Os tipos genéricos podem ainda estar
associados a métodos. O parâmetro genérico representa
uma entrada para a classe ou para o método. Os tipos
genéricos são definidos recorrendo a colchetes e nestes
figura o parâmetro genérico.
2. Os tipos genéricos garantem consistência de tipos quando se
trabalha com polimorfismo e abstração pois com eles o
programador define de forma genérica uma relação estrita
entre a classe e os seus elementos.
3. Um tipo bruto corresponde a uma referência a uma classe
genérica sem o parâmetro associado. Este tipo é usado em
circunstâncias em que não existe necessidade de diferenciar
os parâmetros associados a uma classe genérica.
4. Pode se dar vários exemplos, um deles é o que foi
apresentado ao longo deste tema, o exemplo de motor de
persistência. Faz sentido que este motor use parâmetro
genérico para garantir que não se crie uma “salada russa” ao
persistir e recuperar objetos persistidos. O uso de parâmetro
nesta classe garante que apenas objetos de um tipo podem
ser persistido em um determinado ficheiro; e conforme
ilustrado no exemplo, sem definir parâmetro, há um risco de
se persistir um objeto de um tipo e depois tentar se
recuperar objeto de um tipo completamente diferente.
5. Os subtipos de tipos genéricos podem ser criados de duas
formas: (1) estendendo a classe genérica passando pelo
parâmetro um tipo específico; (2) definindo a classe como
genérica e estendendo ao mesmo tempo a classe genérica.
206
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
207
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas: 1a, 2a, 3b, 4a, 5c, 6c, 7c, 8a, 9b, 10c.
208
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Referências Bibliográficas
209
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Introdução
Collections Framework é um conjunto de classes, interfaces e
algoritmos que permitem representar e manipular estruturas de dados
complexos; basicamente, estas estruturas permitem armazenar os
dados em forma de coleções ao mesmo tempo fornecendo mecanismos
e algoritmos sofisticados de recuperação de dados nessas estruturas.
Nesta unidade temática vamos introduzir este Framework apresentado
os seus componentes essenciais e a vantagem de uso do mesmo quer
em aplicações pequenas quer em grandes aplicações.
Ao completar esta unidade temática 5.1, você deverá ser capaz de:
210
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
211
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Sumário
Exercícios de autoavaliação
Perguntas
1. O que é Collections Framework?
2. Quais são as vantagens do Collections Framework?
3. Liste as interfaces bases do Collections Framework?
4. Quais são algumas implementações das interfaces do
Collections Framework?
212
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas
1. Collections Framework é um conjunto de classes, interfaces
e algoritmos que permitem representar e manipular
estruturas de dados complexos.
2. Collections Framework foi criado para eliminar as lacunas
dos arrays. As classes do Collections Framework flexibilizam
em muito o processo de armazenamento, recuperação e
manipulação de dados com características comuns em
coleções. Além disso, a criação de aplicações de média e
grande porte fica facilitada com a possibilidade de uso da
vasta gama de coleções disponibilizadas pelo JAVA.
3. As interfaces bases do Collections Framework são:
Collection, Set, List, Queue, Deque, Map e SortedMap.
4. Algumas implementações das interfaces do Collections
Framework são: HashSet, TreeSet, ArrayList, LinkedList,
Vector e HashMap.
213
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Introdução
As listas representam as estruturas mais simples do Collections
Framework; uma lista é definida como “Coleção de dados ordenados”
em que cada elemento ocupa uma posição definida por um índice
numérico. A base de todas as listas do Collections Framework é a
interface “List” a qual define os métodos bases de todas as listas. Nesta
unidade temática iremos abordar a essência das listas. Começaremos
por apresentar a interface List e seus métodos mais usados, mais
adiante apresentaremos algumas classes que implementam esta
interface e a aplicação das mesmas.
Ao completar esta unidade temática 5.2, você deverá ser capaz de:
214
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Método Propósito
int size() Retorna a quantidade de elementos
contidos na lista
boolean isEmpty() Retorna “true” se a lista não tiver
elementos ou “false” no caso
contrário.
boolean contains(Object o) Verifica se um determinado objeto
encontra-se ou não na lista. Retorna
“true” se a lista conter o objeto ou
“false” no caso contrário.
Iterator<E>iterator() Disponibiliza o iterador para a lista.
Um iterador é uma instância de
“Iterator” que permite iterar pela
lista.
Object[] toArray() Converte a lista em um array.
Retorna um array contendo todos os
elementos da lista.
boolean add(E e) Adiciona um elemento à lista. O
elemento é adicionado no fim da
lista. Este método retornará “false”
se o elemento não pode ser
adicionado a lista.
boolean remove(E e) Remove da lista a primeira
ocorrência do elemento passado
pelo parâmetro. Este método
retorna “false” se o elemento não
estiver na lista.
boolean Verifica se a lista contém todos os
containsAll(Collection<?> c) elementos contidos numa
215
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
216
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
8
Um método “synchronized” é um método que garante acesso concorrente. Isto é,
em uma aplicação com múltiplas threads tentando invocar o mesmo método [ao
mesmo tempo] apenas uma thread terá acesso ao método a cada instante. As outras
threads só terão acesso ao método após que a thread corrente tiver liberado o
método. É uma técnica que garante que os dados são acedidos e modificados de forma
segura.
217
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Instanciação de listas
O código na figura seguinte apresenta alguns exemplos instanciação de
listas. Mais baixo apresentam-se algumas notas importantes sobre cada
ponto em destaque no código.
218
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Manipulação de listas
A manipulação de listas é feita essencialmente pelos métodos, add e
get. O primeiro permite adicionar um elemento à lista e o segundo
permite obter um elemento em uma determinada célula. Outros
métodos que usualmente são usados é o método “size” e “set”. O
método “size” fornece a quantidade corrente de elementos na lista e o
método “set” permite substituir o elemento numa determinada posição
da lista. O exemplo abaixo usa a classe ArrayList para armazenar e
recuperar instâncias de Pessoa (apresentada na unidade temática 3.5).
Note que o mesmo exemplo poderia ter sido implementado aplicado a
classe Vector ou LinkedList sem grandes modificações no código.
219
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
220
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Iteração em listas
A iteração em listas é o mecanismo pelo qual os programas percorrem
a lista da ponta-a-ponta. Normalmente, a cada iteração o programa
executa algumas operações sobre a lista, estas operações vão desde
simples operações de visualização da informação do elemento corrente
até operações complexas como por exemplo as relacionadas com
ordenação da lista.
A iteração em uma lista é feita usualmente recorrendo ao ciclo “for” ou
recorrendo ao iterador da lista (Iterator). No exemplo seguinte, ilustra-
se diferentes formas de iterar sobre uma lista, no caso, usa-se uma lista
de tipo LinkedList.
221
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Ordenação de listas
Em programação a ordenação de listas é uma operação por vezes
imprescindível, como por exemplo quando se pretende ordenar a lista
de estudantes de uma turma com base no nome ou ordenar os
funcionários de uma instituição com base no seu salário. Collections
Framework disponibiliza alguns mecanismos para a ordenação de listas
e no âmbito deste manual apenas iremos tratar do processo de
ordenação recorrendo ao método “sort” da classe Collections.
222
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
223
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
224
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Sumário
Nesta unidade temática 5.2 abordamos as listas da Collections
Framework. Começamos por definir lista e apresentar a essência da
interface List; trata-se da interface base para todas as listas
disponibilizadas pelo java. De seguida apresentamos as
implementações mais famosas desta interface, nomeadamente:
ArrayList, Vector e LinkedList. Abordamos as diferenças fundamentais
destas implementações bem como a indicação para o uso de cada uma
delas. Foram apresentados alguns exemplos de aplicação destes tipos
de listas. Abordamos ainda a questão de ordenação de listas para
finalizar com polimorfismo com listas.
Exercícios de autoavaliação
Perguntas
1. Descreva a essência de lista;
2. Quais são os métodos mais comuns da interface List usados
para manipular as listas e para que serve cada um desses
métodos?
3. Lista as diferenças essenciais das três implementações mais
comuns da interface List.
4. Modifique o programa apresentado no subtópico
“Ordenação de Listas” para que ordene as pessoas usando o
nome.
5. Modifique o programa criado no exercício anterior para que
liste as pessoas em ordem decrescente de idades.
6. Modifique o programa apresentado no subtópico
“Ordenação de Listas” para que use um iterador para a
listagem de pessoas.
226
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas
1. As listas têm a particularidade de armazenar os seus
elementos em posições específicas da coleção que lembram
uma fila sequencial. Em uma lista, cada elemento ocupa uma
posição (célula) identificada por um índice numérico. O
índice é sempre um número inteiro não negativo com o
“zero” representando a primeira posição da lista e “n - 1”
representando a última posição da lista (onde “n”
representa a capacidade máxima da lista).
2. Os métodos mais comuns da interface List são: (1) add: que
permite adicionar um elemento a lista (2) get: recupera um
elemento numa dada posição da lista (3) size: retorna o
tamanho da lista e (4) set: actualiza um elemento específico
na lista.
3. Do ponto de vista de implementação, ArrayList e Vector são
muito semelhantes, tendo como base Array para armazenar
os seus elementos. Vector é considerado classe legada;
trata-se de uma adaptação da classe Vector que
originalmente não implementava a interface List. Vector é
relativamente mais lenta que ArrayList visto que a primeira
usa métodos sincronizados. Outra diferença entre estas
duas classes consiste no fato de que quando o array
associado estiver completamente lotado, o ArrayList
redimensiona o mesmo em 50% do tamanho corrente ao
passo que Vector duplica o seu tamanho corrente.
227
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
6. Resolução
228
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
229
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Introdução
Os conjuntos constituem estrutura de dados bastante usadas em
aplicações de média e grande porte. Os conjuntos em java aproximam-
se aos conjuntos matemáticos e diferenciam-se fundamentalmente das
listas pelo facto de não aceitarem elementos duplicados e os seus
elementos não serem referenciados índices. À semelhança das listas, os
conjuntos têm como base uma interface, a interface “Set” e o java
disponibiliza algumas implementações desta interface das quais iremos
abordar a classe HashSet.
Ao completar esta unidade temática 5.3, você deverá ser capaz de:
230
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Método Propósito
int size() Retorna a quantidade de elementos
contidos no conjunto.
boolean isEmpty() Retorna “true” se o conjunto não
tiver elementos ou “false” no caso
contrário.
boolean contains(Object o) Verifica se um determinado objeto
encontra-se ou não no conjunto.
Retorna “true” se a lista conter o
objeto ou “false” no caso contrário.
Iterator<E>iterator() Disponibiliza o iterador para o
conjunto. Um iterador é uma
instância de “Iterator” que permite
iterar pelo conjunto.
Object[] toArray() Converte o conjunto em um array.
Retorna um array contendo todos os
elementos do conjunto;
boolean add(E e) Adiciona um elemento ao conjunto
se este ainda não estiver na lista.
Este método retornará “false” se o
elemento não pode ser adicionado
ao conjunto. Note que para que dois
elementos sejam considerados
“mesmo elemento” a comparação
entre os dois usando o método
“equals” deve retornar “true” e os
mesmos devem retornar o mesmo
valor a chamada do método
“hashCode”.
boolean remove(E e) Remove do conjunto o elemento
passado pelo parâmetro. Este
método retorna “false” se o
elemento não estiver no conjunto.
boolean Verifica se o conjunto contém todos
containsAll(Collection<?> c) os elementos contidos numa
“Collection” e retorna “true” nesse
caso.
boolean addAll(Collection<? Adiciona ao conjunto todos os
extends E> c) elementos contidos numa Collection.
boolean Remove do conjunto todos os
removeAll(Collection<?> c) elementos contidos na “Collection”
passada pelo parâmetro
231
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
9
Mais adiante será apresentada a collection “Map” e a usa implementação “HashMap”.
232
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Sumário
Nesta unidade temática 5.3 apresentamos a essência de conjuntos.
Começamos por apresentar a interface Set que descreve as habilidades
comuns a todos os conjuntos do Collections Framework. De seguida
fizemos uma breve revisita a classe HashSet que é uma das
233
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Exercícios de autoavaliação
Perguntas
1. Quais são as características que fundamentalmente diferenciam
um conjunto de listas?
2. Qual é a interface base de conjuntos do Collection Framework?
3. Mencione alguns métodos essências dos conjuntos do
Collections Framework.
4. Explica como faria para localizar um elemento de um conjunto.
5. Elabore um programa que permite armazenar indivíduos em um
conjunto do tipo HashSet e de seguida localize um individuo
específico dado o seu código.
Notas: (1) use a classe Pessoa [apresentada na unidade temática
5.2] como descritor do individuo (2) os dados necessários devem
ser obtidos pelo teclado (3) a quantidade de indivíduos é
indefinida. (4)
Respostas:
1. Enquanto uma lista que representa uma coleção sequencial de
dados, o conjunto representa uma coleção de dados não
sequenciais. As listas podem conter elementos duplicados, ao
passo que os conjuntos, não.
2. A interface base dos conjuntos é Set.
3. Os métodos essenciais dos conjuntos do Collections Framework
são definidos na interface Set, são eles: add que permite
adicionar um elemento ao conjunto; iterator que disponibiliza o
iterador do conjunto; remove que permite remover um elemento
da lista.
4. Para identificar o elemento do conjunto é necessário iterar sobre
este; a iteração pode ser feita recorrendo à iteração pelo respetivo
iterador ou recorrendo ao ciclo “for-each” sobre o conjunto. A
cada iteração seria necessário se o elemento corrente equivale ou
não ao que se pretende identificar.
5. Resolução
234
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
235
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
236
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Introdução
Um mapa é uma estrutura que organiza os dados aos pares; cada par é
constituído por uma chave e o valor correspondente. Os mapas são
largamente usados em aplicações de grande porte incluindo em APIs e
frameworks de desenvolvimento. Nesta unidade temática 5.4 vamos
apresentar a essência dos mapas.
Ao completar esta unidade temática 5.4, você deverá ser capaz de:
237
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
238
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Iteração em um Mapa
A interação em mapas é feita recorrendo ao método “entrySet”. Este
método retorna um conjunto contendo todos os elementos contidos na
lista no formato “Map.Entry<K,V>”. Um “Map.Entry” é um objeto que
permite acesso rápido a “chave” e o correspondente “valor” de um
elemento do mapa. No exemplo seguinte itera-se sobre os elementos
do mapa apresentado no exemplo do tópico anterior.
239
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Sumário
Nesta unidade temática 5.4 abordamos a essência dos mapas. Foi
apresentada a interface “Map” do pacote “java.util” os seus métodos
essências. Finalizamos com exemplos que ilustram o uso dos mapas.
Nestes exemplos aplicamos uma das implementações da interface
“Map”, a classe “HashMap”.
Exercícios de autoavaliação
Perguntas
1. Descreva a estrutura de dados mapa;
2. Quais são algumas implementações da interface “Map” do pacote
“java.util”?
3. Qual é a diferença principal entre mapas e conjuntos do
Collection Framework?
4. Qual é a diferença principal entre mapas e listas?
5. Modifique os programas apresentados nesta unidade temática 5.4
de modo a usarem um mapa cujas as chaves são do tipo String.
Respostas:
1. Mapa é uma estrutura de dados que organiza os dados aos pares.
Cada par é composto por uma “chave” e um “valor”. A chave é
240
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
241
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Respostas: 1-F, 2-F, 3-V, 4-F, 5-V, 6-F, 7-V, 8-F, 9-V, 10-F.
242
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Exercícios do tema
Exercícios de autoavaliação
Perguntas
1. Fale do processo de ordenação de listas.
2. Por que é recomendado o uso da interface List para
referenciar instâncias de subtipos de List?
3. Fale sobre os conjuntos do Collections Framework;
4. Em que circunstâncias se indica o uso de conjuntos?
5. Elabore um programa que permite criar e armazenar em um
Map, instâncias de Pessoa com base em dados lidos pelo
teclado. De seguida, o programa deverá recuperar do mapa
uma pessoa específica dado o seu código e visualizar tal
pessoa. Para gerar as instâncias de pessoa use o descritor de
Pessoa apresentando na unidade temática 5.2.
Respostas
1. A ordenação de listas é conseguida recorrendo ao método
Collections.sort. Este método permite ordenar qualquer lista
que implemente a interface “List”. O requisito único para
que tal lista possa ser ordenada é necessário que o tipo de
parâmetro a ela associada seja um “Comparable”.
2. É recomendável usar a interface para fazer referências à
listas para aumentar a abrangência dos métodos e
flexibilizar a migração de uma lista para outra.
3. Os conjuntos do Collections Framework fazem alusão aos
conjuntos matemáticos; eles têm como base a interface Set.
Os conjuntos não permitem elementos duplicados.
4. O uso de conjuntos é indicado para situações em que se
pretende trabalhar com elementos únicos.
5. Resolução
243
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
Exercícios de avaliação
1. Se uma classe implementa a interface “Comparable” significa
que,
a) Suas instâncias poderão ser comparadas com qualquer
outra instância “comparável”;
244
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
245
ISCED - CURSO: Gestão de Sistemas de Informação; Ano: 40 Disciplina/Módulo: Programação Avançada em Java
a) A primeira;
b) A segunda;
c) Ambas.
9. É possível recuperar um elemento específico de um Set de
Collection Framework?
a) Sim, usando o método “get”;
b) Sim, iterando sobre o iterator associado;
c) Não é possível.
10. Em Collection Framework qual é o perigo de coleções não
“synchronized”?
a) Inconsistência de dados;
b) Insegurança de dados;
c) Confusão nos dados.
Respostas: 1b, 2b, 3b, 4b, 5b, 7a, 8a, 9b, 10a.
Referências Bibliográficas
246
247