Programação de Computadores II
Programação de Computadores II
Programação de Computadores II
Programao de
Computadores II
M528p
Apresentao
Prezado(a) estudante,
A modernidade anda cada vez mais atrelada ao tempo,
e a educao no pode ficar para trs. Prova disso so as
nossas disciplinas on-line, que possibilitam a voc estudar
com o maior conforto e comodidade possvel, sem perder a
qualidade do contedo.
Por meio do nosso programa de disciplinas on-line
voc pode ter acesso ao conhecimento de forma rpida,
prtica e eficiente, como deve ser a sua forma de comunicao
e interao com o mundo na modernidade. Fruns on-line,
chats, podcasts, livespace, vdeos, MSN, tudo vlido para
o seu aprendizado.
Mesmo com tantas opes, a Universidade Tiradentes
optou por criar a coleo de livros Srie Bibliogrfica Unit como
mais uma opo de acesso ao conhecimento. Escrita por nossos
professores, a obra contm todo o contedo da disciplina que
voc est cursando na modalidade EAD e representa,
sobretudo, a nossa preocupao em garantir o seu acesso
ao conhecimento, onde quer que voc esteja.
Sumrio
Parte 1: Princpios da Programao Orientada a
Objetos em Java. . . . . . . . . . . . . . . . . . . . . 11
Tema 1: Introduo Orientao a Objetos . . . . . . . . . . . . . . . . . . . . 13
1.1 Revisando a Linguagem Java . . . . . . . . . . . . . . . . . . . . . . . . 14
1.2 Conceitos Bsicos da OO . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.3 Classes e Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.4 Atributos e Mtodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Tema 2: Herana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47
2.1 Construtores e o Gerenciamento da Memria . . . . . . . . . 48
2.2 Membros de Instncia X Membros de Classe . . . . . . . . . 54
2.3 Herana no Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .61
2.4 A classe Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Referncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Concepo da Disciplina
Ementa
Introduo Orientao a Objetos: Revisando
a Linguagem Java, Conceitos Bsicos da OO, Classes
e Objetos, Atributos e Mtodos. Herana: Construtores e o Gerenciamento da Memria, Membros de
Instncia X Membros de Classe, Herana no Java, A
classe Object. Polimorfismo: Do Conceito Prtica,
Abstract X Final, Interfaces, Interfaces Especiais.
Excees, colees e fluxos: Tratamento de Excees,
Avanando nas Excees, Colees da Java API, Fluxos
de Dados.
Objetivos:
Geral
Apresentar ao aluno os conceitos do paradigma
da Programao Orientada a Objetos na linguagem
de programao Java.
Especficos
Para se estudar num curso a distncia devese ter a clareza que a rea da Educao a Distncia pauta-se na autonomia, responsabilidade, cooperao e colaborao por parte dos envolvidos, o
que requer uma nova postura do aluno e uma nova
forma de concepo de educao.
Por isso, voc contar com o apoio das
equipes pedaggica e tcnica envolvidas na operacionalizao do curso, alm dos recursos tecnolgicos que contribuiro na mediao entre voc
e o professor.
PRINCPIOS DA PROGRAMAO
ORIENTADA A OBJETOS EM
JAVA
Parte 1
Introduo Orientao a
Objetos
14
Programao de Computadores II
Tema 1
15
c) Portabilidade: a Mquina Virtual Java (JVM Java Virtual Machine) garante a portabilidade de todos os programas escritos em Java; estes programas escritos no formato texto (com
a extenso .java) quando so compilados geram automaticamente um outro arquivo bytecode com a extenso .class. Este
bytecode pode ser executado em qualquer ambiente desde
que l contenha a JVM, garantindo a veracidade da frase write once, run anywhere (traduzindo: escreva uma vez, rode em
qualquer lugar).
Figura 01 - A portabilidade permite que o seu cdigo seja executado em qualquer sistema operacional.
d) Alto desempenho: por executar um cdigo que j foi analisado e convertido para um bytecode, obtm-se um bom
desempenho. O coletor de lixo outro fator que melhora a
performance por liberar memria que no est mais sendo
usada. Alm disso, o fato de compilar no prprio ambiente
que ser posteriormente interpretado, faz com que a performance seja melhor.
e) Interpretada: em um primeiro momento ela compilada,
gerando um arquivo bytecode intermedirio que pode ser
executado em qualquer sistema operacional (desde que contenha a mquina virtual Java).
16
Programao de Computadores II
Figura 02 - Aps ser compilado, o arquivo fonte (*.java) se transforma em um arquivo binrio (*.class) e em
seguida pode ser interpretado (podendo antes disso ainda ser verificado).
f) Robustez: entre algumas caractersticas que tornam linguagem Java robusta, podemos citar: possuir no momento da
compilao uma varredura por cdigo no alcanvel; procurar e identificar variveis no inicializadas; ser uma linguagem fortemente tipada; inicializar de maneira implcita todos
os tipos primitivos e possuir uma eficiente manipulao de
excees.
g) Segurana: ser uma linguagem segura muito importante, j
que foi projetada para ambientes distribudos; a JVM garante
em um ambiente web que todos as aplicaes Java fiquem
protegidas de programas maliciosos escritos em qualquer outra linguagem. Alm disso, a coleta automtica de lixo tambm evita erros de gerenciamento de memria frequentes em
outras linguagens. H tambm mecanismos de tratamento de
erros e o fato de todas as variveis terem obrigatoriamente
os tipos informados no momento da declarao fortalecem
ainda mais o fator segurana.
Tema 1
17
18
Programao de Computadores II
Tema 1
19
20
Programao de Computadores II
expresso na parte inferior do loop ao invs do topo (como no while). Consequentemente, as instrues dentro do bloco do-while so
sempre executados pelo menos uma vez.
do {
// instrues
} while (expresso booleana);
Tema 1
21
22
Programao de Computadores II
PARA REFLETIR
Como possvel escrever e compilar um programa na linguagem de
programao Java em um computador com o Sistema Operacional
Windows instalado e em seguida pegar o arquivo compilado (*.class)
e este arquivo funcionar em uma outra mquina que tenha uma verso qualquer do Linux instalada ? Reflita sobre o que faz com que
isto acontea e como isto acontece.
Tema 1
23
24
Programao de Computadores II
por exemplo, pensando de maneira estruturada; desprezando totalmente os recursos e potenciais da linguagem, que foi concebida de
fato como uma linguagem OO.
Hoje em dia, a grande maioria das empresas adota fortemente
a Programao OO (OOP). O que se nota que a OOP apenas mais
uma etapa natural da evoluo do desenvolvimento de software.
Surgimento
Vamos analisar uma histria que a princpio pode parecer desconexa, mas que tem sim um relacionamento com o conceito OO.
Analisando os grandes fabricantes de computadores da atualidade,
percebemos que eles tiveram uma curva de crescimento acelerada,
isto , o sucesso foi atingido de forma relativamente rpida. Claro que
os seus produtos apresentavam uma tima qualidade e que tambm
conseguiam vend-los a preos satisfatrios, alm de que a procura
por PC crescia muito rapidamente. Mas a questo : como estes fabricantes conseguiam produzir tantos modelos de computadores de
forma rpida e ainda ser geis o bastante em uma poca de constantes evolues?
Podemos citar alguns fatores que explicam o que aconteceu: estes fabricantes conseguiram aperfeioar as suas linhas de produo,
passaram a comprar peas de outros fabricantes confiveis e concentraram os esforos apenas na linha de montagem dos computadores.
Isto economizava tempo e recursos na criao e desenvolvimento dos
diversos componentes adquiridos. Quando estes fabricantes compravam um componente, estavam garantindo que estas partes (com suas
propriedades e suas funcionalidades) j estavam pr-testadas, o que
tornava o processo inteiro mais eficiente. Por exemplo, ao invs de
fabricar um disco rgido com uma determinada capacidade de armazenamento e com o papel definido para armazenamento de dados, a
empresa de PC comprava este HD de outro fabricante, especializado
exclusivamente na construo deste componente. No momento em
que estas fbricas deixaram de produzir todas as partes e passaram
a comprar componentes, os seus faturamentos cresceram de maneira
acentuada.
Tema 1
25
Tomando este caso como referncia, podemos fazer um paralelo e perceber que a OOP segue o mesmo princpio. Um sistema
desenvolvido seguindo o conceito OO composto por vrios objetos
(cada um deles com as suas respectivas propriedades e funcionalidades bem definidas). Desta forma o sistema espera apenas que cada
objeto faa a sua parte, sem se preocupar em como isto ser feito,
ou seja, no importa a implementao interna de cada um deles, isto
responsabilidade do desenvolvedor de cada objeto.
Objetivo
O principal objetivo da programao orientada a objeto facilitar o desenvolvimento de software atravs da reutilizao de objetivos anteriormente desenvolvidos. Esta prtica faz com que os sistemas sejam desenvolvidos mais rpido, de maneira mais confivel
e ainda com custos mais baixos. Este objetivo conseguido atravs
diversas caractersticas de programao, sendo possvel utilizar recursos como instanciao, polimorfismo, herana, interface, entre outros.
Conceitos bsicos
Assim como no paradigma procedural as funes fazem o papel
principal, no paradigma OO, o conceito de objeto o ncleo principal.
Um objeto pode ser entendido como uma representao codificada
de qualquer entidade do mundo real, onde este objeto transferido
para linhas de cdigo inclusive com suas caractersticas e seus comportamentos.
A programao orientada a objetos parte do princpio que os sistemas so construdos se espelhando ao mximo nos prprios objetos
da vida real. Antes de fazermos um aprofundamento em cada um dos
pilares da orientao a objetos, devemos ver de maneira simplificada
alguns dos conceitos principais.
Como acabamos de citar, fica evidente que o elemento considerado ponto de partida para o entendimento do conceito OO o prprio
objeto. Entendemos um objeto do mundo real como algo concreto (ex:
um livro) ou como algo conceitual (ex: uma viagem). Definimos que um
objeto possui duas caractersticas: o seu estado e o seu comportamento. Portanto, podemos entender o objeto como qualquer entidade real
existente no nosso mundo.
26
Programao de Computadores II
Outro conceito importante classe, que consiste em um modelo para a fabricao dos objetos. Entenderemos a classe como
sendo uma abstrao do objeto, algo que define todas as caractersticas comuns a todos os objetos. Estas caractersticas podem ser
divididas em estado (que chamamos no momento da codificao de
atributos) e em comportamentos (chamados nos nossos cdigos de
mtodos). Quando um objeto criado, diz-se haver construdo
uma instncia de uma classe. Para que este processo acontea,
necessrio fazer uso do conceito de construtor (maneira de criar a
instncia), conceito que veremos mais adiante (no contedo 2.1).
Classes e objetos sero explorados de maneira mais aprofundada
no contedo seguinte.
Uma instanciao consiste em utilizar classes servindo como
modelos para que os objetos possam ser criados. Um objeto prdefinido passa a exisitr quando um programa executado, passando
a se chamar ento de instncia de classe.
Objetos trocam informaes entre eles atravs de mensagens,
esta a maneira como um objeto invoca um outro objeto ou ento
um mtodo de um outro objeto. Falaremos um pouco mais sobre o
conceito de mensagens no contedo 1.4 deste mesmo tema.
H trs tipos de comunicao entre os objetos, os quais so
brevemente comentados a seguir:
a) associao: so relacionamentos entre classes (ou entre objetos). H dois tipos: agregao e composio;
b) generalizao: tambm conhecida como herana (um dos
pilares da POO), ser brevemente comentada ainda neste
mesmo contedo, porm o conceito de herana ser bastante comentado no tema seguinte (contedo 2.3);
c) dependncia: uma alterao em um elemento altera
diretamente o seu dependente.
A utilizao de uma estrutura bem definida, arrumada em pastas ou pacotes (no ingls package), facilita bastante a organizao de
um sistema composto por um grande nmero de classes. Alm de
Tema 1
27
28
Programao de Computadores II
Tema 1
29
PARA REFLETIR
Reflita junto com seus colegas sobre a importncia dos conceitos
fundamentais da Orientao a Objetos, que so encapsulamento,
herana e polimorfismo.
30
Programao de Computadores II
Tema 1
31
Uma aplicao orientada a objetos construda por vrios objetos que interagem entre si. Cada interao desta vista como uma
troca de mensagens, que ocorre atravs da chamada de mtodos
uns dos outros.
Para assimilar o conceito de classe e objetos, faa a seguinte
atividade, agrupar em classes os seguintes objetos: cachorro, notebook, navio, cavalo, bicicleta, impressora, pato, avio e celular.
Codificando
Toda classe deve comear com letra maiscula e deve ter o
nome igual ao do arquivo; se a classe for Pessoa, o arquivo tem que
ser obrigatoriamente Pessoa.java. Todo cdigo escrito na linguagem
Java fica dentro desta classe. A sintaxe da assinatura de uma classe
consiste em um modificador de acesso + palavra reservada class +
nome da classe, de acordo com o exemplo abaixo:
public class Pessoa {
. . .
}
Aps termos criado a classe Pessoa, podemos em qualquer
outra classe criar uma instncia de Pessoa, chamada pessoa X com
os valores citados anteriormente. Para tanto, utilizaremos a palavra
reservada new, de acordo com o cdigo abaixo:
Pessoa pessoaX = new Pessoa();
Da maneira acima, precisaremos atribuir as informaes reais
(Joo, 25 anos e o telefone 9876-1234) posteriormente. Ou podemos fazer da maneira a seguir:
Pessoa pessoaX = new Pessoa(Joao, 25, 98761234);
A diferena entre as duas construes acima apenas no construtor, ou seja, na forma que a instncia criada. Falaremos mais
sobre construtores no contedo 2.1.
32
Programao de Computadores II
Pacotes
O Kit do Desenvolvedor Java (JDK) contm um conjunto pr-definido de classes, todas estas classes juntas compem a API Java. Elas
so organizadas por afinidade em vrias pastas chamadas de pacotes.
Cada pacote agrupa classes que apresentam propsitos semelhantes,
como operaes matemticas, manipulaes de datas e textos, tratamento de arquivos etc. Outro motivo para a utilizao de pacotes
que assim fica possvel a existncia de classes com o mesmo nome,
desde que localizadas em pacotes diferentes. Isto possvel, uma vez
que quando se deseja referenciar uma classe, faz-se necessrio informar o nome completo da mesma, o que inclui o caminho inteiro do
pacote seguido pelo nome da prpria classe.
Mas claro que, alm de ter disposio uma enorme biblioteca de classes prontas para os mais variados fins, o prprio desenvolvedor est livre para crias as classes necessrias para a construo
do seu software, preocupando-se exclusivamente com as regras de
negcio prprias da sua aplicao. Neste momento, quando ns
desenvolvedores criamos nossos prprios sistemas computacionais,
precisamos criar vrias classes e ento podemos organiz-las tambm
em pastas, tambm chamadas de pacotes (ou packages).
Os pacotes servem para organizar tanto logicamente (por afinidade), como fisicamente (ficando nas mesmas pastas no sistema de
arquivos). Esta organizao melhora a estruturao da aplicao e
tambm otimiza o processo de publicao.
A maneira utilizada para informarmos o pacote ao qual uma
classe pertence identificando na primeira linha da classe a sua declarao de pacote, de acordo com a sintaxe a seguir:
Sintaxe:
package <nome da package>[.<nome da subpackage>];
Por exemplo, para a classe Funcionrio, podemos informar
que o pacote seria como indicado abaixo:
package br.com.empresa;
Tema 1
33
34
Programao de Computadores II
Tema 1
35
= Interger.valueOf(11, 2);
36
Programao de Computadores II
Tema 1
37
PARA REFLETIR
Se os tipos primitivos foram construdos para oferecerem uma melhor
performance, qual a vantagem no uso das classes Wrappers (que
emulam os tipos primitivos)?
Neste momento, preciso que voc faa uma reflexo sobre a preocupao com o desempenho na tecnologia Java. Faa uma ponderao
sobre o fato dos tipos primitivos permanecerem presentes na especificao da linguagem Java e tambm sobre a existncia das classes
Wrappers (que emulam os tipos primitivos).
38
Programao de Computadores II
Tema 1
39
Mensagens
Os objetos precisam se relacionar, precisam trocar informaes
para realizar tarefas, no fazem nada sozinhos. Para que esta comunicao ocorra, deve existir uma troca de mensagens. Estas mensagens
identificam as operaes que precisam ser executadas atravs de trs
componentes:
a) objeto para o qual a mensagem acionada;
b) mtodo dentro do objeto que ser executado;
c) parmetros necessrios para a execuo do mtodo.
Considerando um objeto Veculo, preciso que outro objeto
Motorista lhe envie uma mensagem, por exemplo, acionando o mtodo abrirPorta(), passando ainda um parmetro: qual porta deseja
abrir. H ainda uma grande vantagem na utilizao da troca de mensagens: uma vez que as interaes so feitas atravs destas mensagens, no necessrio que todos os objetos estejam dentro da
mesma aplicao, ou seja, possvel acionar mtodos de objetos que
esto at mesmo em outro servidor de aplicaes web.
Temos ento o entendimento que um programa OO consiste
simplesmente em um conjunto de objetos, sendo especificado em
40
Programao de Computadores II
Figura 08 - Utilizando uma mensagem, o objeto Motorista acessa um mtodo do objeto Veculo.
Acessabilidade
Cada uma das linguagens de programao possui a sua prpria
lista de palavras reservadas para a definio do controle de acesso a variveis e mtodos, mas basicamente existem os seguintes nveis:
a) pblico: permite o acesso por todos os mtodos de todas
as classes, no havendo restries. Este o nvel mais liberado possvel, j seu uso em um atributo significa que no
est sendo utilizado o conceito de encapsulamento.
b) protegido: acesso permitido aos mtodos da prpria classe,
de outras classes do mesmo pacote e tambm por todas as
classes que herdam dela (o conceito de herana ser estudado no tema seguinte, mais precisamente no contedo 2.3).
c) privado: o acesso liberado apenas aos mtodos da prpria
classe. Este o nvel mais protegido possvel e os atributos
devem estar neste nvel de acesso de acordo com a teoria
do encapsulamento.
Tema 1
41
Encapsulamento
De acordo com a teoria de orientao a objeto, encapsular significa ocultar, esconder informaes de um objeto. Consiste em construir
classes que no permitem o acesso direto aos seus atributos, estes no
podero ser lidos ou alterados por outras classes.
Como ento manipular tais informaes? A nica maneira para fazer isso utilizar mtodos da prpria classe construdos especificamente
para esta finalidade. Esses mtodos so divididos em dois tipos:
a) configurador: responsvel pela alterao dos dados, chamado
tambm de setter ou mutator, permite a atualizao do valor
de um atributo. A recomendao que o seu nome inicie com
o prefixo set e seja acompanhado do nome do atributo a ser
atualizado, ex: setNome( ).
b) capturador: mtodo que recupera a informao, tambm chamado de getter ou accessor, retorna o valor de um atributo. A recomendao que o seu nome comece pelo prefixo get e seja
acompanhado do nome do atributo solicitado, ex: getNome( );
Alm de esconder a complexidade do cdigo, o encapsulamento
tambm tem a funo de proteger os dados de classes externas,
42
Programao de Computadores II
Tema 1
43
A palavra-chave this utilizada no exemplo acima serve para fazer referncia ao objeto atual, pode ser utilizada em qualquer ponto
do cdigo e pode acionar tanto os atributos como os mtodos. Em
alguns casos, o seu uso dispensvel, podendo ser usado apenas
como o reforo, como nos casos dos mtodos capturadores (exemplo: getNome), mas, mesmo assim, o seu uso recomendado por
simplesmente aumentar a legibilidade do cdigo. Entretanto, em outras situaes, a presena da palavra this imprescindvel, como nos
mtodos configuradores (exemplo: setNome), com o propsito de
se diferenciar o atributo do parmetro. Claro que este caso poderia
ser resolvido de outra forma, por exemplo, alterando-se o nome do
parmetro, porm o mais comum realmente a construo acima.
Existe ainda outra finalidade para a palavra this, ela pode ser usada
quando se deseja passar como parmetro o prprio objeto atual para
um mtodo qualquer.
Sobrecarga de Mtodos
A programao orientada a objetos permite a existncia de mtodos com o mesmo nome, mas com a lista de parmetros diferentes,
onde esta diferena pode acontecer tanto na quantidade dos argumentos como nos tipos dos mesmos. Esta situao conhecida
como sobrecarga (ou overload) de mtodos.
O uso deste mecanismo no cria um conflito, pois o compilador
ser capaz de entender qual mtodo est sendo acionado justamente
a partir da verificao da lista de parmetros.
Para que seja caracterizada uma sobrecarga de mtodos, os
seguintes fatos devem acontecer:
a) os mtodos em questo devem estar na mesma classe ou
em classes com relacionamento de herana;
b) os nomes dos mtodos devem ser o mesmo;
c) a quantidade de parmetros deve ser diferentes ou os tipos
destes mesmos parmetros.
44
Programao de Computadores II
No contedo 2.1 (j no prximo tema), veremos que os construtores de um objeto podem ser considerados com uma sobrecarga de
mtodos, apesar de alguns autores no considerarem os construtores
como sendo mtodos normais, mas esta uma discusso para o
prximo contedo.
Vejamos ento um exemplo de sobrecarga. A seguir, temos um
mtodo somarNumeros( ) com dois parmetros do tipo inteiro e um
retorno do tipo inteiro.
public int somarNumeros(int nA, int nB) {
return nA + nB;
}
Agora veremos o mesmo mtodo somarNumeros( ), s que com
dois parmetros do tipo real e um retorno tambm do tipo real.
public float somarNumeros(float nA, float nB) {
return nA + nB;
}
Quando formos invocar o mtodo somarNumeros( ), a implementao a ser acionada depender dos tipos de parmetros informados. Se forem passados dois inteiros, o primeiro cdigo ser executado, caso sejam passados dois valores reais, o segundo trecho vai
ser acionado.
Tema 1
45
PARA REFLETIR
Convide os seus colegas para debaterem sobre o encapsulamento.
Analise alguns pontos como o acesso restrito empregado a toda informao, fazendo inclusive uma espcie de camada de proteo,
onde apenas os mtodos getters / setters so pblicos. Aproveite e
apresente tambm as suas reflexes para o tutor.
RESUMO
Voc est de parabns por ter concludo o nosso primeiro tema, no
qual fizemos uma introduo a orientao a objetos. No contedo
1.1, fizemos uma breve reviso da linguagem Java, com suas caractersticas (como portabilidade, robustez e segurana) e seus elementos
principais (entre eles as estruturas condicionais e as de controle).
O contedo 1.2 foi inteiramente dedicado aos conceitos bsicos da
orientao a objetos. Foi feita inicialmente uma breve histria do
surgimento do paradigma OO e depois foram introduzidos temas bsicos como objeto (que representa atravs de cdigo qualquer coisa
do mundo real) e classes (que so os moldes para a construo dos
46
Programao de Computadores II
Herana
48
Programao de Computadores II
Tema 2 | Herana
49
50
Programao de Computadores II
Tema 2 | Herana
51
52
Programao de Computadores II
Tema 2 | Herana
53
54
Programao de Computadores II
PARA REFLETIR
O gerenciamento de memria algo muito importante dentro do conceito de herana, j que podemos estar criando objetos sem a real
necessidade de utilizao. Discuta com seus colegas de turma como
devem ser criados objetos que realmente sejam necessrios, podendo
tambm discutir como o funcionamento do coletor automtico de
lixo (garbage collector).
Tema 2 | Herana
55
56
Programao de Computadores II
Tema 2 | Herana
57
No exemplo anterior, estamos apenas aumentando a quantidade de computadores. Se analisarmos a situao acima, podemos
perceber que, apesar de no termos nenhum objeto criado, podemos manipular a quantidade de computadores. Precisamos, ento, de
muita ateno quando formos utilizar este tipo de atributo.
Como o atributo estar presente durante todo o ciclo de vida
da classe, as variveis estticas tambm estaro presentes e mantendo o seu valor.
Assim como os atributos de uma classe, ns podemos ter os
mtodos estticos. Estes mtodos iro funcionar da mesma maneira
que os atributos, ou seja, vo existir sem a dependncia de uma
instncia de uma classe. Porm, importante lembrar que quando
temos um mtodo esttico no iremos sobrescrever este mtodo na
subclasse, iremos ver o conceito de subclasse no tpico de hierarquia. Caso, na subclasse, formos usar o mesmo mtodo esttico,
teremos que redefinir este mtodo.
Para utilizar um mtodo como esttico, precisamos colocar a
palavra reservada static logo aps o modificador de visibilidade. Por
exemplo, iremos colocar o mtodo esttico na classe computador.
public class Computador{
private int qtdMemoria;
private int qtdDisco;
private static int qtdComputadores;
public Computador (int pQtdMemoria, int pDisco)
{
this.qtdMemoria = pQtdMemoria;
this.qtdDisco = pDisco;
}
public static void Imprimir()
{
System.out.Println(Quantidade de computadores cadastrados: + qtdComputadores);
}
}
58
Programao de Computadores II
Tema 2 | Herana
59
60
Programao de Computadores II
Tema 2 | Herana
61
PARA REFLETIR
A partir deste momento, comeamos a perceber que existem diferentes tipos de criao de variveis, sendo que estas vo depender de
como estamos as declarando. Devemos ento construir atributos de
classes e de instncia de acordo com a nossa necessidade, sempre
tomando cuidado na sua utilizao.
62
Programao de Computadores II
Tema 2 | Herana
63
64
Programao de Computadores II
Tema 2 | Herana
65
Quando falamos menos acessveis, estamos falando dos modificadores de visibilidade. Ou seja, caso a subclasse esteja herdando
de um mtodo public, o mtodo que est sobrescrevendo no pode
ser nem private nem protected.
A herana ainda permite que, alm de sobrescrever os mtodos, ns possamos nos referir a atributos e mtodos da superclasse.
Para realizar esta referncia, utilizamos a palavra reservada super.
Para realizar uma chamada a um mtodo da superclasse devemos
fazer o seguinte:
Super.mtodo( )
Vamos modificar a classe Medico para a utilizao da referncia super.
public class Medico extends Funcionario{
private String CRM;
public Medico (String pCRM, String pNome, int
pIdade)
{
this.CRM = pCRM;
super(pIdade, pNome);
}
public void imprimir() {
System.out.println(Mdico: + nome +
CRM:+ this.CRM);
}
}
66
Programao de Computadores II
No exemplo acima estamos utilizando o mtodo super para reaproveitar o que foi definido no construtor da classe Funcionario. Com
isso, no precisamos reescrever todas as definies do Medico. Basta
apenas definir o que foi acrescentado na herana e realizar a chamada
ao construtor que possui a mesma caracterstica.
A chamada ao mtodo continua sendo realizada da mesma maneira. Por exemplo, como agora definimos um construtor para a classe mdico, quando formos instanciar um objeto deste tipo faremos
da seguinte maneira:
Medico m = new Medico(3245, Pedro, 35);
m.imprimir();
No exemplo apresentado, o construtor da classe Medico ir definir o atributo CRM e ir invocar o construtor da classe Funcionrio
para que os outro dois atributos (nome e idade) sejam iniciados.
Apesar de opcional, podemos indicar ao compilador que estamos realizando uma sobrescrita de um mtodo. Atravs da diretiva
@Override ns conseguimos garantir, em tempo de compilao, que
o mtodo que estamos criando uma sobrescrita de um mtodo da
superclasse.
public class Medico extends Funcionario{
private String CRM;
public Medico (String pCRM, String pNome, int
pIdade)
{
this.CRM = pCRM;
super(pIdade, pNome);
}
@Override
public void imprimir() {
System.out.println(Mdico: + nome + CRM:+
this.CRM);
}
}
Tema 2 | Herana
67
PARA REFLETIR
Com a utilizao da herana podemos perceber que, quando utilizada
de maneira correta e bem modularizada, a herana nos traz uma produtividade maior. Isto porque podemos reutilizar bastante as classes
que j foram criadas anteriormente. Reflita com o tutor e com os seus
colegas sobre o assunto.
68
Programao de Computadores II
Tema 2 | Herana
69
70
Programao de Computadores II
Tema 2 | Herana
71
72
Programao de Computadores II
transitivo: a, b e c, se a.equals(b) e b.equals(c) so verdade ento a.equals(c) tem que ser verdade.
Tema 2 | Herana
73
O resultado de equals() entre um objeto e nulo deve retornar sempre falso, ou seja, a.equals(null) sempre falso.
74
Programao de Computadores II
PARA REFLETIR
Na orientao a objetos sempre utilizamos tipos criados por ns.
Porm, nunca tnhamos parado para pensar que o Java j possua um
objeto genrico para todas as nossas classes. Com este tpico podemos perceber que podemos comparar objetos atravs de reescrita
de mtodos.
Tema 2 | Herana
75
RESUMO
No captulo 2.1, podemos aprender como so criados os construtores
de um objeto. Atravs da criao destes construtores podemos ver
que, ao criar um objeto, podemos j cri-los com seus atributos j
definidos. Neste captulo tambm aprendemos que o Java possui um
gerenciador de memria, sendo que este o responsvel por descartar objetos que no esto sendo mais utilizados.
Enquanto, no captulo 2.2, ns estudamos a diferena entre os membros de instncia e os membros de classe. Vimos que a principal
diferena que os mtodos de um membro de instncia s podem
ser utilizados quando tivermos uma instncia da classes enquanto os
membros de classe podem ser utilizados a qualquer momento.
J no captulo 2.3, ns aprendemos o conceito de herana. Atravs
deste conceito podemos perceber que com a reutilizao do cdigo
fica mais fcil, j que podemos criar objetos com caractersticas semelhantes a objetos j criados, sendo que sempre podemos reaproveitar
mtodos e atributos j criados.
Por fim, no captulo 2.4, aprendemos que todos os objetos criados e
os objetos existente no Java so uma herana da classe Object. Vimos
que esta classe responsvel por alguns mtodos que todos os outros objetos possuem, como o toString() e o equals( ).
ASPECTOS AVANADOS DA
PROGRAMAO ORIENTADA
A OBJETOS EM JAVA
Parte 2
Polimorfismo
80
Programao de Computadores II
Tema 3
| Polimorfismo
81
Neste momento, vlido lembrarmos a frase que mereceu ateno poucos pargrafos atrs: quem decide qual comportamento
o mais adequado para a situao o objeto que possui o mtodo
acionado. Para comprovar a veracidade desta afirmao, podemos
constatar que foi o objeto Veiculo quem decidiu qual mtodo foi acionado. Isto aconteceu de acordo com o seu tipo, que poderia ser Carro,
Lancha ou qualquer outra classe desde que herdasse de Veiculo.
82
Programao de Computadores II
Tema 3
| Polimorfismo
- uma classe FuncionarioMensalista que tambm herda de Funcionario e contm o atributo salarioMensal e o mtodo calcularSalario( ).
public class FuncionarioMensalista
extends Funcionario {
private double salarioMensal;
public double calcularSalario()
{
return salarioMensal;
}
}
O modelo descrito acima ilustra como a empresa categoriza os seus funcionrios. Independentemente do tipo, todo funcionrio deve ser capaz
de calcular o seu prprio salrio.
Caso seja um horista, o salrio ser a multiplicao do atributo salarioHora pelo atributo horasTrabalhadas, o que acontece no trecho de cdigo na
prxima pgina.
83
84
Programao de Computadores II
Tema 3
| Polimorfismo
85
matricula)
matricula, String nome)
matricula, String nome,
codigoCurso)
86
Programao de Computadores II
PARA REFLETIR
Neste momento de reflexo, realize um debate com seus colegas
sobre a importncia de dois conceitos: a sobrecarga de mtodos
(overload) e sobreposio de mtodos (overriding), analisando os
benefcios de cada um e as suas aplicaes prticas.
Tema 3
| Polimorfismo
87
88
Programao de Computadores II
Tema 3
| Polimorfismo
89
90
Programao de Computadores II
Tema 3
| Polimorfismo
91
92
Programao de Computadores II
Classe final
Uma classe final no pode ser herdada por nenhuma outra
classe. Um motivo para isso garantir uma maior segurana para a
classe e incrementar a sua eficincia. Quando se utiliza o modificador
final em uma classe, entende-se que ela est totalmente completa e
no necessrio (sequer possvel) haver subclasses herdando de uma
classe final. gerado um erro de compilao caso, em qualquer classe, seja usada a palavra reservada extends seguida do nome de uma
classe que seja final.
Outra situao em que tambm acontece erro de compilao
quando uma classe declarada ao mesmo tempo como sendo
abstrata e final. Neste caso, haveria uma contradio, o modificador
abstract estaria indicando que esta classe no est completa (que
existiria um mtodo abstrato e que este mtodo precisaria ser implementado pela sua subclasse); enquanto que a presena concomitante
do modificador final estaria informando exatamente o contrrio, que
a classe agora estaria completa e no poderia haver nenhuma subclasse herdando dela. Por isso, acontece o erro em tempo de compilao, para que seja evitada uma situao de conflito impossvel de
ser resolvida.
Quando uma classe definida como final, todos os mtodos
contidos so implicitamente final. Isso implica que nenhum mtodo
pertencente a esta classe final possa ser redefinido. O que parece
ser condizente, afinal de contas a prpria classe no pode mesmo ser
herdada por nenhuma outra classe, ento no haveria condies de
fato de nenhum mtodo ser mesmo redefinido em subclasses.
Muitas classes da prpria API Java so final, como java.lang.
String e java.lang.System. A seguir, veremos um simples exemplo de
uma classe final.
public final class Jogo(String[] args) {
// atributos
...
// mtodos
...
}
Tema 3
| Polimorfismo
93
PARA REFLETIR
A partir do momento em que informarmos que uma determinada
classe abstrata (precedendo com a palavra reservada abstract), faa
uma reflexo sobre o motivo de no podermos mais obter instncias
a partir dela, at que faamos as devidas implementaes dos mtodos abstratos.
94
Programao de Computadores II
3.3 Interfaces
Definio
Antes de comearmos a falar de Interfaces, devemos relembrar
algumas informaes a respeito de classes abstratas. J sabemos
que uma classe abstrata no pode ser instanciada, ou seja, no se
pode construir objetos a partir da sua definio. Devemos lembrar
tambm o conceito de mtodo abstrato (aquele que no possui implementao) e que uma classe abstrata deve possuir ao menos um
mtodo abstrato.
Desta forma, estamos prontos para entender o conceito de Interface. Inicialmente podemos fazer uma aproximao de interface com
uma classe abstrata pura. Lembrando que para ser pura, uma classe
abstrata precisa possuir exclusivamente mtodos abstratos, ou seja,
no possui nenhum mtodo implementado. Uma caracterstica importante de uma interface exatamente esta, nenhum mtodo implementado, todos os mtodos tm obrigatoriamente que ser abstratos.
O papel da interface simplesmente descrever o que outras
classes devem fazer, porm no especificam como elas devem fazer.
Temos ento somente as assinaturas dos mtodos (nome, parmetros e tipo de retorno), sem nenhuma implementao. Como todos
os mtodos so abstratos, podemos tornar implcitas as palavras
modificadoras public e abstract, simplesmente para evitar a repetio (a presena destas palavras no implica em erro, apenas geram
redundncia).
Interfaces servem como especificaes de padres de comportamentos para as classes. A sua utilizao permite um projeto de
software mais bem elaborado, contendo funcionalidades mais organizadas.
Pode haver atributos na interface, porm estes seriam (tambm implicitamente) public, static e final (tornando-os constantes).
Repete-se a informao anterior, ou seja, a presena destas palavras
perfeitamente dispensvel, porm no ocasionam nenhum tipo de
erro. O que no pode acontecer o uso da palavra-chave final em
um mtodo, pois isto impediria que ele fosse implementado pela
classe que a implementa. Entenderemos melhor esta situao aps
a leitura da seo Implementao a seguir.
Tema 3
| Polimorfismo
95
Implementao
Quando tnhamos uma classe (seja ela abstrata ou no), falvamos em herana (utilizando a palavra-chave extends), agora com
interface passaremos a falar em implementao e usaremos para isso
outra palavra-chave implements. Quando dizemos que uma classe
implementa uma interface, garantimos que as funcionalidades determinadas pela interface estaro presentes na classe. Podemos entender que uma interface uma espcie de contrato a ser seguido pelas
classes que a implementam.
A sintaxe de uma interface a seguinte:
[visibilidade] interface nome_Da_Interface
[extends Outras_Interfaces] {
// declarao de constantes
// assinatura dos mtodos abstratos
}
Vamos analisar algumas caractersticas de um cdigo de uma
interface:
- ao invs da palavra class, notamos a presena da palavra
interface;
- no h construtor (afinal no se pode criar uma instncia a
partir dela mesmo);
- os mtodos possuem apenas a assinatura (no pode haver
{ e } ).
Antes vejamos como seria um cdigo de uma classe abstrata pura.
public abstract class Transporte {
public abstract void acelerar();
public abstract void frear();
public abstract double getVelocidade();
}
96
Programao de Computadores II
Tema 3
| Polimorfismo
97
Quando uma classe implementa uma interface, esta classe precisa codificar os mtodos abstratos originados a partir da interface.
Mas possvel acontecer o seguinte fato: a classe no codificar um ou
mais mtodos abstratos. Deste modo, teramos uma classe contendo
um mtodo abstrato, consequentemente esta seria considerada uma
classe abstrata. Afinal de contas, para que isso no acontecesse,
todos os mtodos abstratos presentes na interface deveriam sofrer
sobreposio (overriding) na classe que faz a implementao.
Uma constatao a ser feita que uma interface pode herdar de
outras interfaces, o que faz com que ela receba todos os mtodos
abstratos de todas as outras interfaces que ela herda, porm uma
interface no pode implementar outra interface, afinal ela no teria
capacidade de implementar os mtodos abstratos.
Uma interessante comparao conceitual de uma interface
com um controle remoto. Ele contm botes que representam de uma
maneira simplificada as operaes que o usurio deseja fazer, no
interessando a maneira como feita um aumento de volume, ligar/
desligar, tocar, parar, o que importa o que a funo faz e no
como ela faz.
Faamos agora um rpido resumo destacando as principais diferenas entre uma classe abstrata (assunto do contedo anterior) e
uma interface.
Classe abstrata
- uma classe s pode herdar de outra classe;
- geralmente se encontra mtodos implementados (no abstrato);
- agrupa objetos com implementaes compartilhadas;
- define novas classes atravs de herana (simples) de cdigo.
Interface
- uma classe pode implementar vrias interfaces;
- no pode haver mtodo implementado (todos tm que ser
abstratos);
- agrupa objetos com implementaes diferentes;
- define novas interfaces atravs de herana (simulando herana
mltipla).
98
Programao de Computadores II
Tema 3
| Polimorfismo
99
Por fim, veremos agora uma classe que herda da classe Figura
Geometrica e ao mesmo tempo implementa a interface Imprmivel
acima:
public class Quadrado extends FiguraGeometrica
implements Imprimivel {
// atributo lado
private int lado;
// construtor padro
public Quadrado() {
this.setLado(0);
}
// construtor especfico
public Quadrado(int lado) {
this.lado = lado;
}
// mtodos get e set
public int getLado() {
return this.lado;
}
public void setLado(int lado) {
this.lado = lado;
}
// mtodo que calcula a rea
public int calcularArea() {
return this.getLado() * this.getLado();
}
// mtodo que calcula o permetro
public int calcularPerimetro() {
return 4 * this.getLado();
}
// mtodo que imprime o atributo lado,
// a rea e o permetro
public void imprimir() {
System.out.println(Quadrado);
System.out.println(Lado:+
this.getLado());
System.out.println(rea: +
this.calcularArea());
System.out.println(Permetro: +
this.calcularPerimetro());
}
}
100
Programao de Computadores II
Tema 3
| Polimorfismo
101
PARA REFLETIR
Uma importante reflexo deve ser feita neste momento. Faa uma
ponderao sobre a ausncia do conceito de Herana Mltipla (que
no existe na linguagem Java, mas existe em outras linguagens de
programao orientada a objetos); perceba que a ausncia pode ser
totalmente suprida com o conceito de Interface.
102
Programao de Computadores II
Tema 3
| Polimorfismo
103
104
Programao de Computadores II
Tema 3
| Polimorfismo
105
Vale ressaltar que o valor positivo no precisa ser necessariamente +1, pode ser realmente qualquer valor maior que zero e o
mesmo se aplica para o valor negativo.
Na classe Aluno descrita abaixo (com enfoque dado apenas
ao mtodo compareTo()), veremos que as instncias de Aluno sero
ordenadas da menor para a maior idade, pois o mtodo compareTo()
foi construdo para este propsito.
public class Aluno
implements Comparable<Object> {
// atributos
private String nome;
private int idade;
// construtores ...
// mtodos getters e setters ...
public int compareTo (Object o) {
Aluno e = (Aluno) o;
return this.getIdade() - e.getIdade();
}
}
106
Programao de Computadores II
J na classe Aluno2, acontece uma pequena troca dos operadores no mtodo compareTo(), que passa a retornar a diferena da
idade do parmetro menos a idade do prprio objeto. Esta alterao
implica em instncias ordenadas da maior para a menor idade.
public class Aluno2
implements Comparable<Object> {
// atributos
private String nome;
private int idade;
// construtores ...
// mtodos getters e setters ...
public int compareTo (Object o) {
Aluno e = (Aluno) o;
return e.getIdade() - this.getIdade();
}
}
Tema 3
| Polimorfismo
107
108
Programao de Computadores II
Tema 3
| Polimorfismo
109
PARA REFLETIR
Converse e reflita junto com seus colegas sobre as vantagens (e os
riscos) do uso da interface Cloneable. Lembre de discutir tambm a
importncia de o mtodo clone() ser protegido.
110
Programao de Computadores II
RESUMO
Voc merece os parabns! Concluiu mais um importante tema do
nosso livro.
Aps a leitura do contedo 3.1, voc adquiriu conhecimentos sobre
conceitos fundamentais de polimorfismo, entendeu o funcionamento,
alm de ter visto um exemplo prtico. O passo seguinte foi, no contedo 3.2, aprender duas palavras reservadas bastante utilizadas na
linguagem Java: abstract e final. Vimos que abstract pode ser aplicada em mtodos e em classes, enquanto que final foi vista sendo
aplicada em varivel, em mtodo e tambm em classe.
Outro assunto fundamental para a programao orientada a objetos
que aprendemos no contedo 3.3 foi interface. Inicialmente vimos
uma definio do conceito de interface, destacando o seu uso como
um poderoso recurso com o objetivo de diminuir o acoplamento entre as classes. Alm disso, as interfaces ainda podem ser utilizadas
como uma soluo para suprir a ausncia do conceito de herana
mltipla (que no existe na linguagem Java). Foi ressaltado tambm
a diferena conceitual entre uma herana e uma implementao. Por
fim, no contedo 3.4, estudamos algumas interfaces especiais (Cloneable, Comparable, Interator e Interable) e suas aplicaes prticas.
Agora chegou o momento de nos dedicarmos ao ltimo tema do nosso
livro. Nele iremos aprender excees, colees e fluxos de dados.
Tenha uma boa leitura!
112
Programao de Computadores II
113
114
Programao de Computadores II
115
Esta mensagem exibida ao aluno incompreensvel e pouco amigvel para este tipo de usurio. Contudo, ela descreve o caminho de
execuo que resultou na exceo, ou seja, o rastreamento de pilha de
execuo, e muito til para os desenvolvedores do programa, uma
vez que eles so capazes de entender a estrutura da mensagem e extrair dela as informaes necessrias para localizar e tratar as excees.
Tratamento de Exceo
Para evitar que o programa interrompa sua execuo inesperadamente e mostre ao usurio mensagens pouco amigveis necessrio realizar o tratamento de excees.
Em Java, as excees so tratadas por meio de trs clusulas:
try, catch e finally.
A clusula try (tentar) utilizada para definir um bloco de instrues que pode gerar alguma exceo. Assim, o try monitora a
execuo das instrues que esto no escopo do bloco e caso ocorra
uma exceo, ela poder ser capturada pelo bloco catch. A seguir, a
sintaxe de um bloco try:
try {
// Instrues
}
// Blocos catch e finally
A clusula catch (capturar) define um bloco que responsvel
por capturar e tratar a exceo. possvel definir nenhum ou vrios
blocos catch, sendo que cada bloco ser capaz de identificar e tratar
um determinado tipo de exceo.
A seguir, a sintaxe de um bloco try-catch:
try {
// Instrues
} catch (<Tipo da exceo> <nome do objeto>) {
// Instrues de tratamento da exceo ExceptionType
}
// Blocos catch e finally
116
Programao de Computadores II
117
118
Programao de Computadores II
Podemos observar, na Figura 12, que o cdigo executou corretamente, ou seja, todas as instrues presentes no escopo do bloco
try foram executadas e, como no houve nenhuma exceo, o bloco
catch foi pulado no executado, ento, o programa executou o
bloco finally. Este o fluxo de execuo natural quando existe uma
sequncia de blocos try-catch-finally e nenhuma exceo lanada.
Agora vamos observar o que ocorre quando um aluno descuidado atribui sua nota por extenso e o cdigo est sendo tratado com
try-catch-finally.
119
120
Programao de Computadores II
PARA REFLETIR
Vocs aprenderam que o a palavra-chave return utilizada em um
mtodo para retornar uma informao para o mtodo que o invocou.
Discuta com seus colegas e com o tutor o que acontece se uma exceo
ocorrer antes do return ser executado.
121
122
Programao de Computadores II
123
Lanando excees
Uma exceo lanada por meio da clusula throw e uma instncia da classe de exceo que se deseja lanar. Quando o Java
executa a clusula throw, o fluxo de execuo natural do mtodo
modificado, retornando ao mtodo que o invocou. Logo, importante
ter em mente que a clusula throw retorna exceo que ocorreu e
no ao resultado do processamento do mtodo.
Ao lanar uma exceo, ns devemos informar ao mtodo que
ele pode lanar esta exceo. Para isso, utilizamos a palavra reservada throws na assinatura do mtodo, juntamente com a classe de
exceo. A clusula throws obrigatria para excees verificadas,
mas facultativa para excees no verificadas.
importante ficar atento diferena entre as palavras reservadas throw e throws. A clusula throw retorna uma exceo do tipo
informado, ou seja, lana a exceo. J a palavra reservada throws,
informa que o mtodo pode lanar uma exceo do tipo definido na
sua assinatura. O cdigo a seguir descreve um exemplo de sintaxe do
lanamento de excees.
public class <Nome da Classe> {
public void <Mtodo>() throws <Exceo> {
throw new <Exceo>();
}
}
124
Programao de Computadores II
valor do saque deve sempre ser maior do que zero. O Java possui,
na hierarquia de classes, uma classe com objetivo de lanar excees
para informar que o valor do parmetro informado ilegal, a classe
IllegalArgumentException. Portanto, ns devemos lanar uma exceo
deste tipo e informar no seu construtor uma mensagem amigvel
para o usurio: O valor do saque deve ser maior que 0.. O trecho
de cdigo a seguir descreve o mtodo sacar da classe Conta para
solucionar a situao 1.
public class Conta {
. . . // Cdigo omitido
public void sacar(double valor) {
if (valor < 0)
throw new IllegalArgumentException(O valor
do saque deve ser maior que zero.);
saldo = saldo - valor;
}
. . . // Cdigo omitido
}
125
126
Programao de Computadores II
127
128
Programao de Computadores II
PARA REFLETIR
Vocs aprenderam que o a palavra-chave throw utilizada para lanar
uma exceo. Discuta com seus colegas o que acontece quando uma
exceo do tipo no verificada lanada com throw, no tratada e
nem relanada.
129
nosso cotidiano. Por exemplo, um fila de clientes em uma casa lotrica, uma pilha de livros na biblioteca, um conjunto de itens na lista
de compras, dentre outras.
A API do Java define uma hierarquia de classes e interfaces para
lidar com colees.
A Figura 16 ilustra a hierarquia de colees. A interface Collection define a raiz da hierarquia de colees. O Set, List e Queue so
interfaces definidas a partir de Collection.
A interface Map define a estrutura de um mapa que associa
uma chave a um valor. Esta interface no deriva de Collection, devido
a sua estrutura.
Colees
A interface Collection define desde operaes de adio, remoo e busca de um (add, remove, contains) ou de vrios elementos
(addAll, removeAll, containsAll) na coleo, at estruturas de navegao sobre a coleo (iterator), alm de mostrar informaes sobre
o estado da coleo como, por exemplo, tamanho da coleo (size)
e se est ou no vazia (isEmpty). A interface permite ainda remover
todos os elementos da coleo (clear) ou obter sua representao em
array (toArray).
comum utilizar a interface Collection como parmetro de mtodos que lidam com colees para aproveitar das vantagens do polimorfismo.
130
Programao de Computadores II
Lista
A interface List deriva da Collection para definir uma sequncia
ordenada que permita elementos duplicados. Assim como nos arrays,
os programadores possuem total controle da posio do elemento
na coleo para realizar operaes de insero, remoo e obteno
do elemento por meio de ndices. O primeiro elemento da lista est
localizado no ndice zero(0).
A interface List implementada por diferentes classes, sendo as
principais: a ArrayList e a LinkedList.
A classe ArrayList implementa uma lista por meio de um array
redimensionvel. Nela, as operaes (adio e remoo) entre elementos da sequncia so ineficientes, pois implicam na reorganizao
do array.
A classe LinkedList implementa uma sequncia em que cada
elemento possui a referncia do prximo na lista. Deste modo, as
operaes entre elementos tornam-se eficiente.
Conjunto
A interface Set deriva da Collection para definir um conjunto de
elementos. Em outras palavras, esta estrutura de dados define uma
sequncia de elementos no repetidos.
A interface Set implementada por diferentes classes, sendo as principais: a HashSet e a TreeSet.
A classe HashSet implementa um conjunto no qual os elementos esto dispersos em uma tabela hash por meio de
uma funo hash. A grande vantagem desta estrutura o
tempo constante para operaes bsicas de adio, remoo, localizao e tamanho do conjunto.
A classe TreeSet armazena elementos em uma rvore rubronegra. Esta classe garante a complexidade de tempo de
log(n) para as operaes bsicas.
131
Mapas
A interface Map define um mapa que associa uma chave a um
determinado valor. Assim, as operaes desta estrutura de dados dependem da chave utilizada. A interface Map no deriva de Collection,
uma vez que sua estrutura bem diferente.
A interface Map implementada por diferentes classes, sendo as principais: a HashMap e a TreeMap.
132
Programao de Computadores II
133
134
Programao de Computadores II
135
Diante do cdigo e da Figura 18, ns podemos observar que inicialmente foi criado um mapa com os ingredientes da receita e suas
respectivas quantidades. O mapa foi criado declarando uma varivel
da interface Map e instanciando um objeto da classe TreeMap, que
define um mapa com os elementos ordenados pela chave.
Em seguida, as frutas foram adicionadas no mapa, com suas
respectivas quantidades, por meio do mtodo put(fruta, quantidade).
Como j sabemos, as operaes realizadas no mapa so feitas
por meio de chave. Ento, para obter a quantidade de uva a ser comprada na feira utilizamos o mtodo get, passando como parmetro a
chave, ou seja, o nome da fruta.
136
Programao de Computadores II
PARA REFLETIR
Discuta com seus colegas de classe sobre as facilidades e as vantagens de utilizar a estrutura de dados lista ao invs de vetores em
Java.
137
138
Programao de Computadores II
139
Para entendermos o funcionamento das classes File, FileInputStream e FileOutputStream vamos codificar um programa cujo objetivo
ler os dados de um arquivo de origem, denominado entrada.txt,
imprimir suas informaes na sada padro (console) e, em seguida,
salvar as informaes no arquivo sada.txt.
public class Arquivos {
public static void main(String[] args) throws IOException {
// Arquivo de entrada
File arqEntrada = new File(src/entrada.txt);
// Arquivo de sada
File arqSaida = new File(src/saida.txt);
// Fluxo de entrada
InputStream entrada = new FileInputStream(arqEntrada);
// Fluxo de sada
OutputStream saida = new FileOutputStream(arqSaida);
try {
// Ler um byte do arquivo
int byteLido = entrada.read();
// Ler um bytes do arquivo at o fim do fluxo
while (byteLido != -1) {
// Imprimir o byte lido, convertido em caracter
System.out.print((char) byteLido);
// Salvar o byte lido no fluxo de sada
saida.write(byteLido);
// Ler um novo byte
byteLido = entrada.read();
}
} finally {
// Garantir que os fluxos sejam finalizados
entrada.close();
saida.close();
}
}
}
140
Programao de Computadores II
No cdigo, ns podemos perceber que foram criados, inicialmente, dois objetos para representar o arquivo de entrada e de sada,
respectivamente. Em seguida, foram instanciados os fluxos de entrada e sada para tais arquivos.
Protegido por uma clusula try-finally tentou-se ler bytes do arquivo de entrada, por meio do mtodo read, at obter o fim do fluxo
de entrada. A cada byte lido, o valor era impresso para sada padro,
por meio do mtodo System.out.print, e escrito no arquivo de sada,
usando o mtodo write do fluxo de sada. Por fim, os fluxos de entrada e sada eram finalizados, garantindo a consistncia da informao.
A soluo utiliza fluxos de bytes, mas possvel criar fluxos de
caracteres. Para criar um fluxo de entrada de caracteres utilizamos a
classe FileReader. Enquanto, para criar um fluxo de sada de caracteres, utilizamos a classe FileWriter.
A grande vantagem em criar fluxos de caracteres poder tratar
os dados seguindo a codificao Unicode. O padro de codificao
Unicode permite representar e manipular texto em qualquer sistema
de escrita existente.
Por outro lado, estas classes realizam a leitura e escrita caractere a caractere e, normalmente, quando estamos tratando de texto
queremos ler e escrever linhas inteiras de caracteres. Para isso, o
pacote java.io disponibiliza classes que trabalham com buffers de
dados, a BufferedReader e a PrintWriter.
Um buffer uma regio de memria temporria para leitura e
escrita de dados, comumente utilizada quando existem diferenas
entre a taxa de recebimento e processamento dos dados. Esta estratgia fornece operaes de leitura e escritas mais eficientes.
A classe concreta BufferedReader para leitura eficiente de fluxos
de caracteres, arrays e linhas. Esta classe disponibiliza os mtodos
read e readline. O primeiro permite ler um ou vrios caracteres. O segundo l uma linha de caractere, ou seja, l caracteres at encontrar
um finalizador de linha.
A classe concreta PrintWriter permite escrever diferentes tipos
de dados em um fluxo de caracteres de sada. Uma das principais
vantagens adicionar caracteres ao fim do arquivo, alm de escrever
cadeias de caracteres formatadas.
141
142
Programao de Computadores II
143
PARA REFLETIR
Voc j conhece a classe Scanner, do pacote java.util, e est acostumado a utilizar esta classe para ler dados da entrada padro (console).
Para isso, vocs instancia um objeto de Scanner informando ao construtor que o fluxo de entrada de dados o System.in. Discuta com seu
colega o que acontece se voc informar ao construtor um objeto File,
que representa um arquivo armazenado no seu computador.
144
Programao de Computadores II
RESUMO
No captulo 4.1 ns aprendemos que uma exceo uma indicao de
um problema ocorrido durante a execuo do programa que permite
ao programador a possibilidade de tratar o problema por meio de
blocos try-cath-finally, ou relanar o objeto da exceo ocorrida para
o mtodo chamador, usando a palavra reservada throw. Em ambos
os casos, o principal objetivo maximizar a robustez do programa.
No captulo 4.2 ns estudamos a hierarquia de excees e vimos
que ela pode ser facilmente estendida pelos programadores a fim
de tratar problemas especficos. Nesta hierarquia, ns podemos encontrar classes de excees verificadas e no verificadas. As classes
verificadas so subclasses de Exception e no herdam da classe RuntimeException. Estas classes so assim denominadas, uma vez que o
tratamento ou relanamento da exceo obrigatrio.
J no captulo 4.3 ns aprendemos a lidar com colees de dados em
Java. Uma coleo uma estrutura de dados capaz de armazenar referncias a objetos. O Java fornece uma biblioteca predefinida para lidar
com colees. Assim, podemos facilmente criar listas, instanciando
objetos da classe ArrayList ou LinkedList; definir conjuntos, por meio
das classes HashSet e TreeSet ou criar mapas do tipo chave-valor,
usando as classes HashMap ou TreeMap.
Por fim, no captulo 4.4, aprendemos que possvel persistir informaes em dispositivos de memria secundria, por meio de fluxos de
dados. Um fluxo de dados uma sequncia ordenada de dados transmitidos de ou para diferentes dispositivos. comum criar fluxos de
entrada para ler dados de um arquivo, por meio de objetos da classe
FileInputStream, ou definir fluxos de sada para armazenar dados, por
meio da classe FileOutputStream. Em ambos os casos necessrio
instanciar um objeto da classe File para representar o arquivo a ser
manipulado.
145
Referncias
AMARAL, M. Trabalhando com arquivos do Java IO ao NIO 2. Disponvel em: <http://blog.caelum.com.br/evolucao-do-java-io-ao-ni/>. Acesso
em: 16 de nov. de 2011.
BARNES, J. D; KOLLING, M. Programao Orientada a Objetos com
Java. 4. ed. So Paulo: Editora Pearson, 2009.
CADENHEAD, R.; LEMAY, L. Aprenda em 21 dias Java 2. 4. ed. So
Paulo: Elsevier Editora Ltda, 2005.
DEITEL, P.J. Java Como Programar. 8. ed. So Paulo: Editora Pearson,
2010.
HORSTMANN, C.S.; CORNELL, G.. Core Java 2. Vol 1 - Fundamentos. 7. ed. So Paulo: Alta Books, 2005.
KUNG, F. Lidando com Exceptions. Disponvel em <http://blog.caelum.
com.br/lidando-com-exceptions/>. Acesso em 16 de novembro de 2011.
LAFORE, ROBERT. Estrutura de dados e algoritmos em java. So Paulo:
Cincia Moderna, 2004.
MENDES, D. R. Programao Java com nfase em Orientao a Objetos.
So Paulo: Novatec Editora Ltda, 2009.
SINTES, A. Aprenda Programao Orientada a Objetos. So Paulo:
Pearson Education do Brasil, 2010.
146
Programao de Computadores II
Anotaes
Programao de Computadores II
Anotaes
147
148
Programao de Computadores II
Anotaes
Programao de Computadores II
Anotaes
149
150
Programao de Computadores II
Anotaes
Programao de Computadores II
Anotaes
151
152
Programao de Computadores II
Anotaes