Вы находитесь на странице: 1из 562

Programao Orientada a Objetos com Java

Ricardo Terra
rterrabh@gmail.com
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 1 / 549
CV
Nome: Ricardo Terra
Email: rterrabh (at) gmail.com
www: ricardoterra.com.br
Twitter: rterrabh
Lattes: lattes.cnpq.br/ 0162081093970868
Ph.D. (UFMG/UWaterloo),
M.Sc. (PUC Minas)
Background
Acadmico : UFSJ (desde 2013), FUMEC (3 anos ), UNIPAC (1 ano ), FAMINAS (3 anos )
Prossional : DBA Eng. (1 ano ), Synos (2 anos ), Stefanini (1 ano )
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 2 / 549
1. Introduo Contedo
1
Introduo 3
Viso Geral de POO 4
2
UML 22
3
Java 62
4
POO 186
5
Padres de Projeto 359
6
Tpicos Relevantes 389
7
Materiais Complementares 420
8
Extras 510
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 3 / 549
Introduo
Viso Geral de POO
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 4 / 549
Introduo Viso Geral de POO
Origem da POO
Simula
Foi a primeira linguagem de programao a introduzir os
conceitos subjacentes a programao orientada a objetos
(objetos, classes, subclasses, mtodos virtuais, coletor de lixo
etc)
Mas, no foi amplamente desenvolvida
Smalltalk
Linguagem puramente orientada a objetos
Atualmente
C++
Object Pascal
Java
Python
Eiffel
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 5 / 549
Introduo Viso Geral de POO
Linguagem para criao de modelos
UML
Padro OMG (Object Management Group)
Mais utilizada nos dias de hoje
Utilizaremos bastante o Diagrama de Classe, um dos seus 14
diagramas, em nossa disciplina
Booch
OOSE (Object-Oriented Software Engineering)
OMT (Object Modeling Technique)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 6 / 549
Introduo Viso Geral de POO
Paradigma de Programao
Denio
Conjunto de regras e/ou hipteses que governam a
denio de um modelo
Aplicao na computao/informtica
Auxiliar na conduo do processo de busca da soluo
(modelo conceitual) de um problema
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 7 / 549
Introduo Viso Geral de POO
Exemplos de paradigma de programao
Procedural (imperativo)
um paradigma de programao que descreve a
computao como aes (instrues) que mudam o estado
(variveis) de um programa. Muito parecido com o
comportamento imperativo das linguagens naturais que
expressam ordens, programas imperativos so uma
sequncia de comandos para o computador executar
Orientado a objetos
um paradigma de programao que utiliza objetos e a
interao entre eles para projetar aplicaes e programas
de computador. Suas tcnicas de programao podem
incluir caractersticas como encapsulamento, polimorsmo e
herana. Esse paradigma no era comumente usado no
desenvolvimento de aplicaes de grande porte at incio
de 1990. Atualmente, vrias linguagens modernas suportam
POO
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 8 / 549
Introduo Viso Geral de POO
Objeto
Objeto uma coisa, uma entidade, alguma coisa que
voc levanta ou chuta, qualquer coisa que voc possa
imaginar que tenha sua prpria identidade. (Mike
ODocherty, 2005)
Possuem caractersticas (atributos)
Possuem comportamentos (mtodos)
Assume responsabilidades no domnio do problema
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 9 / 549
Introduo Viso Geral de POO
Classe
Uma classe encapsula caractersticas comuns a grupos de
objetos. (Mike ODocherty, 2005)
Pode ser pensada de vrias formas:
Um conjunto de especicaes que caracterizam como
seus membros devem ser
Um molde que produz objetos com a mesma forma
...
Enm
Desenvolvedores utilizam classes para descrever elementos
de programao que alguns tipos de objetos tero
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 10 / 549
Introduo Viso Geral de POO
Classe
Atributos
Representam as informaes (caractersticas) que os objetos
da classe tero
Por exemplo, uma pessoa tem um nome, idade, peso etc
Mtodos
Representam as aes (comportamentos) que os objetos da
classe realizaro
Por exemplo, uma pessoa respira, come, bebe etc
Encapsulamento
Classe a menor unidade modular de POO, isto , no existe
nada menor que uma classe
Assim, classe denida como um grupo de atributos,
mtodos e outros membros que so tratado como uma
nica unidade modular
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 11 / 549
Introduo Viso Geral de POO
Herana
Basicamente, a habilidade de denir novas classes
baseadas em classes existentes
Suponha:
Um animal
Animal morre
Um mamfero um animal
Mamfero morre
Mamfero mama (novo)
Um leo um mamfero
Leo morre
Leo mama
Leo ruge (novo)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 12 / 549
Introduo Viso Geral de POO
Herana requer o entendimento dos conceitos de
superclasse e subclasses
Superclasses so as classes mais genricas em sua hierarquia
Subclasses so as classes mais especcas em sua hierarquia
Com base no exemplo anterior:
Animal
superclasse de Mamfero e Leo
Mamfero
superclasse de Leo
subclasse de Animal
Leo
subclasse de Animal e Mamfero
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 13 / 549
Introduo Viso Geral de POO
Sobreposio
Voc sobrepe uma operao quando deseja que uma
operao herdada seja realizada diferentemente pela
subclasse
Por exemplo, uma cobra se alimenta de ratos, mas um tipo
especco de cobra (subclasse) se alimenta diferentemente
Assim, necessrio sobrepor o mtodo alimentar:
Classe Cobra
void alimentar (Rato comida) { /
*
mata e come
*
/ }
Classe Cascavel
@Override
void alimentar (Rato comida) { /
*
come mesmo vivo
*
/ }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 14 / 549
Introduo Viso Geral de POO
Sobrecarga
Voc sobrecarrega uma operao quando deseja que a
mesma operao tambm seja realizada por entradas
diferentes
Por exemplo, uma cobra se alimenta de ratos, mas um tipo
especco de cobra (subclasse) se alimenta tambm de
ratazanas
Assim, necessrio sobrecarregar o mtodo alimentar:
Classe Cobra
void alimentar (Rato comida) { /
*
mata e come
*
/ }
Classe Cascavel
@Override
void alimentar (Rato comida) { /
*
come mesmo vivo
*
/ }
void alimentar (Ratazana comida) { /
*
come tambm
*
/ }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 15 / 549
Introduo Viso Geral de POO
Polimorsmo
Habilidade de um objeto poder ser tratado como qualquer
uma de suas classes mais genricas (superclasses)
Com base no exemplo anterior:
Leo pode ser visto como um animal
Contudo, se for visto como animal, s poder morrer
Um leo pode ser visto como um mamfero
Contudo, se for visto como mamfero, s poder morrer e
mamar
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 16 / 549
Introduo Viso Geral de POO
Repasso
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 17 / 549
Introduo Viso Geral de POO
Agenda Telefnica
Atributos
lista de contatos
Operaes
inserir contato
alterar contato
excluir contato
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 18 / 549
Introduo Viso Geral de POO
Contato (para uma agenda telefnica)
Atributos
nome
endereo
telefone
email
Operaes
obter/alterar nome
obter/alterar endereo
obter/alterar telefone
obter/alterar email
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 19 / 549
Introduo Viso Geral de POO
Cavalo (como ele )
Atributos
peso
altura
cor
raa
...
Operaes
andar
comer
puxar carroa
relinchar
...
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 20 / 549
Introduo Viso Geral de POO
Exerccios: modele as seguintes classes
Conta
Equao (de 2
o
grau)
Escola
Filme
Telefone
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 21 / 549
2. UML Contedo
1
Introduo 3
2
UML 22
Diagrama de Classe 23
3
Java 62
4
POO 186
5
Padres de Projeto 359
6
Tpicos Relevantes 389
7
Materiais Complementares 420
8
Extras 510
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 22 / 549
UML
Diagrama de Classe
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 23 / 549
UML Diagrama de Classe
Classe x Objeto
As classes formam o alicerce do diagrama de classes. Para
trabalhar com diagrama de classes, voc precisa ter uma
noo clara da diferena entre classes e objetos
Assim:
Classe a denio/molde para um recurso. Ela inclui
informaes que descrevem os recursos de uma entidade e
como ela pode ser utilizada
Objeto, ao contrrio, uma instncia de uma classe.
Pode-se dizer que um objeto uma entidade identicvel de
forma exclusiva de acordo com as regras denidas pela
classe
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 24 / 549
UML Diagrama de Classe
Importncia
Se algum chegar perto de voc em um beco escuro e
disser: Psiu, quer ver um diagrama UML?, esse
provavelmente seria um diagrama de classes. A maioria
dos diagramas UML que vejo so diagramas de classes.
(FOWLER, 2005)
O diagrama de classes provavelmente o diagrama mais
utilizado da UML. Na verdade, o diagrama de classes a
ferramenta de modelagem principal para descrever a
prpria UML. (PENDER, 2004)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 25 / 549
UML Diagrama de Classe
Denio
Um diagrama de classes descreve os tipos de objetos
presentes no sistema e os vrios tipos de relacionamento
estticos existentes entre eles
Os diagramas de classe tambm mostram os atributos e
operaes de uma classe e as restries que se aplicam
maneira como os objetos estabelecem dependncia
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 26 / 549
UML Diagrama de Classe
Uma classe uma descrio de um conjunto de objetos
que partilham os mesmos atributos, operaes, relaes e
semntica
Por exemplo, na classe Pessoa, dito que uma pessoa tem
nome, idade, altura etc. Contudo, no diz qual o nome, a
idade, a altura etc
Se algo tem um nome, uma idade, uma altura etc, esse algo
um objeto de Pessoa
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 27 / 549
UML Diagrama de Classe
Uma classe descrita em seus aspectos estruturais por seus
atributos e em seus aspectos comportamentais por suas
operaes
Uma classe representada como abaixo:
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 28 / 549
UML Diagrama de Classe
errado pensar que uma classe deve corresponder a uma
entidade humana, uma coisa fsica, algo que voc v ou
toca etc
Por exemplo, pode-se representar entidades mais abstratas:
Venda, Saudade, Amor etc
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 29 / 549
UML Diagrama de Classe
Atributos
So propriedades (caractersticas) semelhantes que os
objetos de uma classe possuem
Por exemplo, na classe Pessoa, o nome, a idade, a altura
so seus atributos
Um atributo pode ser de um tipo primitivo, uma coleo,
um arranjo, um objeto de outra classe etc
Os valores dos atributos diferenciam objetos. Por exemplo,
na classe Carro, sabe-se, dentre outras propriedades, que
o meu carro prata. Como o seu preto, no pode ser o
mesmo carro
Em outras palavras, o valor do atributo cor diferenciou os
objetos
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 30 / 549
UML Diagrama de Classe
Atributos e operaes permitem que sejam especicados
detalhes de sua visibilidade e de sua multiplicidade
(abordaremos isso a frente)
A sintaxe bsica de um atributo :
[visibilidade] nome : [tipo] { = valor-inicial }
Exemplos:
+ nome : String
- salario : double = 1000.00
# nota : int
cor : double
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 31 / 549
UML Diagrama de Classe
Operaes
So comportamentos (aes) que os objetos de uma
classe possuem
Por exemplo, na classe Pessoa, comer, beber, dormir so
suas operaes
Os valores dos atributos diferenciam objetos. Contudo, eles
inuenciam nas operaes. Por exemplo, na classe Pessoa,
uma pessoa que pesa 100kg certamente vai comer mais
que uma que pesa 45kg
Existem operaes que no sofrem inuncia dos atributos,
mas no comum
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 32 / 549
UML Diagrama de Classe
A sintaxe bsica de uma operao :
[visibilidade] nome ( [parmetros] ) : [retorno]
Exemplos:
- mostrar( ) : void
+ calcularTaxa( valorDolar : double ) : double
# somar( a : int , b: int ) : int
delta( ): double
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 33 / 549
UML Diagrama de Classe
Atributos e operaes estticos
Um atributo ou operao que no pertence a uma
instncia da classe, mas classe como um todo so
chamados de atributo ou operao esttico
Atributos e operaes estticos so compartilhados por
todas as instncias da classe, no pertencendo a uma
instncia especca
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 34 / 549
UML Diagrama de Classe
Por exemplo, na classe ContaPoupanca, a taxa de
rendimento comum a todas as contas poupanas
Logo, um atributo esttico
Atributos ou operaes estticos so representados com
um sublinhado. Observe:
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 35 / 549
UML Diagrama de Classe
Visibilidade
possvel especicar como os atributos e operaes sero
vistos no sistema
Eis os nveis de visibilidade:
(+) PBLICO: Todas as classes visualizam
(-) PRIVADO: Somente a prpria classe visualiza
(#) PROTEGIDO: Todas as classes do mesmo pacote e
tambm as subclasses visualizam
() PACOTE: Todas as classes do mesmo pacote visualizam
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 36 / 549
UML Diagrama de Classe
Exemplo (hipottico, cunho acadmico)
Somente a prpria classe tem acesso direto aos atributos
Qualquer classe pode ligar ou desligar o veculo
Somente classes do mesmo pacote ou subclasses podem acelerar ou frear o
veculo
Somente a prpria classe pode ativar o ABS
Somente classes do mesmo pacote podem saber o consumo do veculo
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 37 / 549
UML Diagrama de Classe
Associao
Uma das maneiras de se criar um atributo atravs de uma
associao
Associao uma linha cheia entre duas classes
Logo veremos navegabilidade
Por exemplo, uma NotaFiscal possui pelo menos um
objeto do tipo ItemNotaFiscal e um ItemNotaFiscal
est vinculado a uma nica NotaFiscal
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 38 / 549
UML Diagrama de Classe
Observe que no necessrio (nem correto) explicitar que
NotaFiscal possui uma coleo de ItemNotaFiscal
A prpria associao diz isso
Cdigo Java correspondente
public class NotaFiscal {
private Collection<ItemNotaFiscal> itensNotaFiscal;
...
}
public class ItemNotaFiscal {
...
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 39 / 549
UML Diagrama de Classe
Navegabilidade
possvel denir a navegabilidade de uma associao
No exemplo anterior, a navegabilidade s ocorre de
NotaFiscal para ItemNotaFiscal
Isto , o ItemNotaFiscal no sabe a NotaFiscal em que
se encontra
Nos prximos slides veremos como a navegabilidade muda
o projeto
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 40 / 549
UML Diagrama de Classe
Original: Somente a NotaFiscal conhece ItemNotaFiscal
Cdigo Java correspondente
public class NotaFiscal {
private Collection<ItemNotaFiscal> itensNotaFiscal;
...
}
public class ItemNotaFiscal {
...
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 41 / 549
UML Diagrama de Classe
Somente o ItemNotaFiscal conhece a NotaFiscal
Cdigo Java correspondente
public class NotaFiscal {
...
}
public class ItemNotaFiscal {
private NotaFiscal notaFiscal;
...
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 42 / 549
UML Diagrama de Classe
Ambas as classes se conhecem (Associao Bidirecional)
Cdigo Java correspondente
public class NotaFiscal {
private Collection<ItemNotaFiscal> itensNotaFiscal;
...
}
public class ItemNotaFiscal {
private NotaFiscal notaFiscal;
...
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 43 / 549
UML Diagrama de Classe
Composio
Tipo especial de associao em que se deseja indicar uma
ideia de todo e parte
A parte no vive sem o todo
representado por um losango preenchido ao lado da
entidade que representa o todo
No exemplo abaixo, seria impossvel existir um
ItemNotaFiscal sem estar vinculado a uma NotaFiscal
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 44 / 549
UML Diagrama de Classe
Agregao
Tipo especial de associao em que se deseja indicar uma
associao mais forte
Contudo, a entidade agregada tem vida sozinha
representado por um losango vazio ao lado da entidade
que representa o todo
No exemplo abaixo, um Motor est agregado a um Carro,
mas possvel existir um motor sem estar em um carro
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 45 / 549
UML Diagrama de Classe
Multiplicidade
A multiplicidade em uma associao indica o nmero de
objetos que um objeto da classe pode ter de uma outra
classe
Multiplicidades so nmeros simples ou intervalos de
nmeros
Tabela : Multiplicidade mais comuns
0..1 Uma instncia opcional
1 Exatamente uma instncia
0..* Zero ou mais instncias
1..* Pelo menos uma instncia
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 46 / 549
UML Diagrama de Classe
Casamento Tradicional
Poliginia
Poliandria
???
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 47 / 549
UML Diagrama de Classe
Classes Associativas
Algumas associaes de muitos para muitos exige a
necessidade da criao de uma classe associativa entre as
duas classes associadas
No exemplo abaixo existe a classe Paciente com seus
atributos e a classe Exame com seus atributos. Do
relacionamento entre Paciente e Exame, tem-se a data da
realizao e o diagnstico
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 48 / 549
UML Diagrama de Classe
Classes Associativas
Observe que a classe Consulta que liga as classes
Paciente e Exame
Cdigo Java correspondente
public class Paciente {
...
}
public class Exame {
...
}
public class Consulta {
private Paciente paciente;
private Exame exame;
...
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 49 / 549
UML Diagrama de Classe
Otimizao
Por motivos de desempenho, talvez seja importante manter
uma lista de Consulta em Paciente e em Exame
Por exemplo, do modo abaixo mais eciente obter as
consultas de um certo paciente
No entanto, seja cauteloso em manter objetos sincronizados
public class Paciente {
private Collection<Consulta> consultas;
}
public class Exame {
private Collection<Consulta> consultas;
}
public class Consulta {
private Paciente paciente;
private Exame exame;
...
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 50 / 549
UML Diagrama de Classe
Generalizao
Trata-se da ao de uma classe herdar toda a estrutura de
uma outra classe
Uma subclasse sempre herda de sua superclasse:
Atributos
Operaes
Relacionamentos
Uma subclasse pode:
Adicionar atributos e operaes
Adicionar relacionamentos
Sobrepor (override) operaes herdadas
Sobrecarregar (overload) operaes herdadas
A herana completa, isto , no tem como uma classe
herdar somente certos atributos ou operaes
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 51 / 549
UML Diagrama de Classe
ContaCorrente e ContaPoupanca herdam Conta
Isto , so subclasses imediatas de Conta
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 52 / 549
UML Diagrama de Classe
ContaCorrente e ContaPoupanca herdam Conta
Isto , so subclasses imediatas de Conta
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 52 / 549
Algo que pode ser
melhorado neste diagrama?
UML Diagrama de Classe
Classe Abstrata
Se for um bom observador, percebeu que a classe Conta
no ltimo slide estava em itlico
Isso indica que a classe abstrata
Uma classe abstrata uma classe que no tem instncias
utilizada somente como mecanismo de reso e para
provr a capacidade polimrca
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 53 / 549
UML Diagrama de Classe
Pacotes
Os pacotes em um diagrama de classes so altamente
utilizados, pois, na implementao do sistema, a
organizao das classes so sempre feitas utilizando
pacotes
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 54 / 549
UML Diagrama de Classe
Notas e comentrios
Como em qualquer diagrama UML, podem ser inseridos
notas e comentrios
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 55 / 549
UML Diagrama de Classe
Cuidado
Diagrama de Classes no um modelo ER
O maior perigo com os diagramas de classes que voc
pode focar exclusivamente na estrutura e ignorar o
comportamento
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 56 / 549
UML Diagrama de Classe
Exerccio de Fixao 01
A grca ABC trabalha com diversos autores que escrevem os
livros que ela publica. Alguns autores escreveram apenas um
livro, enquanto outros j escreveram vrios. Alm disso, alguns
livros foram escritos por vrios autores, porm um livro deve
possuir pelo menos um autor. A grca ABC trabalha tambm
com diversas impressoras, porm um livro s pode ser impresso
em uma nica impressora.
Deve ser possvel buscar os livros de um autor, saber qual foi a
impressora em que o livro foi impresso, saber a quantidade de
pginas que uma impressora j imprimiu e a quantidade de
pginas que ela imprimiu de um determinado livro, entre outros.
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 57 / 549
UML Diagrama de Classe
Exerccio de Fixao 01 Soluo
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 58 / 549
UML Diagrama de Classe
Exerccio de Fixao 02
Um veculo tem chassi, modelo, peso, ano de fabricao. Um
veculo no existe por si s, ele deve ser um avio ou um carro.
Todo veculo liga e desliga. Um carro acelera e frea e um avio
decola, voa e pousa.
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 59 / 549
UML Diagrama de Classe
Exerccio de Fixao 03
Um imvel possui um endereo, rea (em m
2
) e um proprietrio. O
imvel pode ser uma casa ou um apartamento. Caso seja casa,
possuir tambm o nmero do registro do lote e, caso seja
apartamento, possuir o nmero do andar e um ag indicando se
possui ou no elevador. Um proprietrio possui cpf, nome e telefone.
Pelo menos, as seguintes operaes devem existir:
Alterar a rea de um imvel
Alterar o proprietrio de um imvel
Alterar o ag se possui ou no elevador do apartamento
Recuperar a quantidade de imveis de um proprietrio
Alterar o telefone de um proprietrio
PS: Ateno com os parmetros e com o tipo de retorno das operaes
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 60 / 549
UML Diagrama de Classe
Exerccio de Fixao 04
Uma pessoa possui cpf e nome. Um professor uma pessoa que tambm possui uma
titulao e a IES (Instituio de Ensino Superior) vinculada. Um aluno tambm uma
pessoa e possui a informao de qual perodo se encontra e qual o seu curso (um curso
possui um registro do MEC, um nome e sua rea de concentrao). Uma palestra
possui um nome e um assunto e pode ser ministrada por diversos professores. Para cada
professor ministrando cada palestra, deve constar a data e a localizao (rua, nmero,
bairro, cidade, estado e telefone) deste evento e, um aluno, pode assistir vrios eventos.
Pelo menos as seguintes operaes devem existir:
Alterar a rea de um imvel
Alterar o nome de uma pessoa
Alterar a titulao de um professor
Alterar a IES de um professor
Alterar o perodo em curso de um aluno
Alterar o curso de um aluno
Alterar o registro do MEC de um curso
Alterar o nome de uma palestra
Alterar a data de um evento
Alterar a localizao de um evento
Alterar o telefone de uma localizao
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 61 / 549
3. Java Contedo
1
Introduo 3
2
UML 22
3
Java 62
Introduo 63
Tipos Bsicos 87
Operadores 101
Comandos condicionais 119
Comandos de repetio 138
Arranjos 157
Mtodos 172
4
POO 186
5
Padres de Projeto 359
6
Tpicos Relevantes 389
7
Materiais Complementares 420
8
Extras 510
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 62 / 549
Java
Introduo
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 63 / 549
Java Introduo
Logo Mascote Duke
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 64 / 549
Java Introduo
Objetivos
Apaixonar-se por Java
Diferenciar:
Programao Estruturada (Pascal, C...)
Programao Orientada a Objetos (Java, C++...)
Pr-requisitos
Lgica de Programao
Linguagem C
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 65 / 549
Java Introduo
Edies Java
Java SE Java Standard Edition (Verso Atual: 7)
www.oracle.com/technetwork/java/javase
Java EE Java Enterprise Edition
www.oracle.com/technetwork/java/javaee
Java ME Java Micro Edition
www.oracle.com/technetwork/java/javame
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 66 / 549
Java Introduo
Tipos de Aplicaes
Applets
Aplicao que normalmente utiliza o navegador do cliente
para prover a interface do usurio
Processamento realizado no servidor
Applications
Dispensa explicao
Servlets
Execuo em servidores web
Exemplos: JSP, JSF, Struts etc
Midlets
Execuo em pequenos dispositivos
Portlets
Execuo em portais
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 67 / 549
Java Introduo
Falcias sobre Java
Java muito fcil de aprender
Java muito difcil de aprender
Java um ambiente de programao
Todos os programas Java executam em pginas web
JavaScript uma verso mais simples de Java
Java interpretado e, portanto, muito lerdo para
aplicaes srias em uma plataforma especca
Leia artigo Anlise Comparativa do Cdigo Gerado por
Compiladores Java e C++ publicado no SBLP 2010
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 68 / 549
Java Introduo
Principais Caractersticas da Linguagem Java
Compilao para bytecodes
Prov portabilidade (saberemos logo o porqu)
Suporte a multi-programao
Suporte a threads
OO
Segura
No existe ponteiros
Gerncia automtica de memria (no existe mais malloc,
free etc)
Eciente
JIT Compiler, otimizaes dinmicas etc
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 69 / 549
Java Introduo
Java SE Componentes Entendimento Visual
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 70 / 549
Java Introduo
Java SE Componentes
API Application Programming Interface
Biblioteca com diversas classe e funes teis para ser
utilizada no desenvolvimento de aplicaes
JVM Java Virtual Machine
Mquina virtual em que a aplicao Java executada
Contm implementao de toda API Java
JRE Java Runtime Environment
Ambiente de execuo de aplicativos Java
Contm a JVM
JDK Java Development Kit
Ambiente de desenvolvimento de aplicativos Java
(compilao, depurao etc)
Contm o JRE
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 71 / 549
Java Introduo
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 72 / 549
Java Introduo
Funcionamento
Compilador
Entrada: cdigo fonte
Sada: bytecodes
Bytecodes
Cdigo intermedirio a ser interpretado pela JVM
Independente de plataforma
JVM
Class Loader: carrega o bytecode para a memria
Bytecode Verier: confere a consistncia do bytecode
Interpreter: interpreta os bytecodes para cdigo de mquina
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 73 / 549
Java Introduo
Java SE Funcionamento Entendimento Visual
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 74 / 549
Java Introduo
Hello Terra Cdigo
1 public class HelloTerra {
3 public static void main( String[] args ) {
System.out.println( "Hello Terra!" );
5 }
7 }
Hello Terra Explicao Supercial
Case-sensitive
Todo o programa sensvel a caixa: A = a
Mtodo main
Ponto de entrada de uma aplicao Java
System.out.println (sop)
Impresso em tela
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 75 / 549
Java Introduo
Compilao e Execuo
Compilar: javac HelloTerra.java
Executar: java HelloTerra
No entanto, o Eclipse faz tudo para voc sem que perceba =)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 76 / 549
Java Introduo
Java e outras linguagens
Linguagem realmente orientada por objetos
Menos que Eiffel
Sintaxe muito baseada na sintaxe de C
if, switch, while, do..while, for ...
Tipos de dados bsicos similares ao da linguagem C
Remoo de vrias caractersticas perigosas de C
Ponteiros
Aritmtica de ponteiros
Gerenciamento automtico de memria (no existe mais
malloc, free etc)
API bem completa
Web, GUI (Graphical User Interface), Networking etc
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 77 / 549
Java Introduo
Classes
Uma vez que vimos Diagrama de Classes, o entendimento
ca fcil
Dene um TAD (Tipo Abstrato de Dados)
Contm:
atributos (propriedades)
mtodos (comportamento)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 78 / 549
Java Introduo
Classe Pessoa Exemplo Simples
1 public class Pessoa {
private String nome;
3
public String getNome() {
5 return this.nome;
}
7
public void setNome( String nome ) {
9 this.nome = nome;
}
11
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 79 / 549
Java Introduo
Estrutura de um Arquivo Java
Pacote
onde o arquivo se encontra
Imports
do que o arquivo necessita
Classe Pblica
Apenas uma por arquivo
Deve ter o mesmo nome do arquivo
Classes No Pblicas
Conceito Avanado (no veremos)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 80 / 549
Java Introduo
Estrutura de uma Classe Java
Atributos
propriedades
estticos depois dinmicos
Construtores
como seus objetos so criados
ordenados pela quantidade de
parmetros
Mtodos
comportamentos
estticos depois dinmicos
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 81 / 549
Java Introduo
Classe Pessoa Exemplo Mais Completo
package pojo;
2
import java.util.Date;
4
public class Pessoa {
6 public final static String ESPECIE = "Homo Sapiens";
private String nome;
8 private Date dataNascimento;
10 public Pessoa() { }
12 public Pessoa(String nome, Date dataNascimento) {
this.nome = nome;
14 this.dataNascimento = dataNascimento;
}
16
public String getNome() {
18 return this.nome;
}
20 public void setNome( String nome ) {
this.nome = nome;
22 }
public Date getDataNascimento() {
24 return this.dataNascimento;
}
26 public void setDataNascimento( Date dataNascimento ) {
this.dataNascimento = dataNascimento;
28 }
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 82 / 549
Java Introduo
Comentrios
Algumas vezes se deseja explicar um cdigo, explicitar uma
informao em linguagem natural
Eles no deixam o programa mais lento e seu uso
altamente recomendvel
Trs tipos:
Comentrio para bloco de linha (semelhante a C)
/
*
blablabla
*
/
Comentrio at nal de linha (semelhante a C)
// blablabla
Comentrio JavaDoc (gera manual do sistema)
/
*
@author Ricardo Terra
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 83 / 549
Java Introduo
Classe Matematica Exemplo Comentrio
1 /
**
*
Classe com atributos e operacoes matematicas
3
*
@author Ricardo Terra
*
/
5 public class Matematica {
/
**
7
*
Atributo PI com apenas 6 casas decimais
*
/
9 public static final double PI = 3.141569; // Constante PI
11 /
**
*
Metodo que calcula a area de uma circunferencia
13
*
@param raio Raio da circunferencia
*
@return Area da Circunferencia
15
*
/
public static double areaCircunferencia( double raio ) {
17 /
*
*
A funcao pow da classe Math eleva a uma potencia,
19
*
no caso ao quadrado
*
/
21 return PI
*
Math.pow( raio, 2 );
}
23
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 84 / 549
Java Introduo
Classe Matematica JavaDoc gerado
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 85 / 549
Java Introduo
Padres BluePrints
Nomes de classes
CamelCase com primeira letra em caixa alta
Ex: Animal, AnimalSelvagem, GuardaChuva ...
Nome de identicadores, atributos ou mtodos
CamelCase com primeira letra em caixa baixa
Ex: nome, nomeCompleto, comer(), comerMuito() ...
Nome de pacotes
Sempre em caixa baixa
Ex: com.terra.pojo, com.terra.dataaccessobject ...
Evitem caracteres especiais:
_, -, , , , , ...
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 86 / 549
Java
Tipos Bsicos
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 87 / 549
Java Tipos Bsicos
Identicadores
Atribuio como em C
int valor;
double saldo = 324.20;
Declarao de uma varivel pode ocorrer em qualquer
local, evidentemente, antes do uso
Diferentemente de C, Pascal, Object Pascal ...
Regras de identicador
Primeiro caracter deve ser letra, _ ou $
So case-sensitive
Logicamente, identicadores deve ser diferente das
palavras reservadas da linguagem
= de for, while, int ...
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 88 / 549
Java Tipos Bsicos
Tipos Primitivos
boolean (1 bit) true e false
char (16 bits sem sinal) 0 a 65535
byte (8 bits) -128 a 127
short (16 bits) -32768 a 32767
int (32 bits) 2
31
a 2
31
1
long (64 bits) 2
63
a 2
63
1
float (32 bits) 1.40239846e
46
a 3.40282347e
38
double (64 bits) 4.94065645841246544e
324
a 1.7976931348623157e
308
Qualquer outro tipo no citado acima so classes
Por exemplo, String, Date so classes
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 89 / 549
Java Tipos Bsicos
Exemplo Observando Limites
public static void main( String[] args ) {
2 System.out.printf( "boolean: %b e %b\n", Boolean.TRUE, Boolean.FALSE );
4 System.out.printf( "char: %d e %d\n", (int)Character.MIN_VALUE,(int)Character.MAX_VALUE );
6 System.out.printf( "byte: %d e %d\n", Byte.MIN_VALUE, Byte.MAX_VALUE );
System.out.printf( "short: %d e %d\n", Short.MIN_VALUE, Short.MAX_VALUE );
8 System.out.printf( "int: %d e %d\n", Integer.MIN_VALUE, Integer.MAX_VALUE );
System.out.printf( "long: %d e %d\n", Long.MIN_VALUE, Long.MAX_VALUE );
10
System.out.printf( "float: %g e %g\n", Float.MIN_VALUE, Float.MAX_VALUE );
12 System.out.printf( "double: %g e %g\n", Double.MIN_VALUE, Double.MAX_VALUE );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 90 / 549
Java Tipos Bsicos
Tipo char
Representa um caractere UNICODE
http://www.tamasoft.co.jp/en/general-info/unicode.html
Intervalo de 0 a 255 semelhante tabela ASCII
Atribuio:
a, \u0040 ou nmero
Exemplo
1 public static void main( String[] args ) {
char ch = a;
3 System.out.println( ch ); /
*
a
*
/
5 ch = \u0040;
System.out.println( ch ); /
*
@
*
/
7
ch = 98;
9 System.out.println( ch ); /
*
b
*
/
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 91 / 549
Java Tipos Bsicos
Tabela UNICODE (parcial)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 92 / 549
Java Tipos Bsicos
Exemplo Imprimindo Tabela ASCII
public static void main( String[] args ) {
2 for ( char ch = 0; ch < 255; ch++ ) {
System.out.printf( "%d: %c\n", (int) ch, ch );
4 }
}
Exemplo Imprimindo Tabela UNICODE
1 public static void main( String[] args ) {
for ( char ch = 0; ch < 65535; ch++ ) {
3 System.out.printf( "%d: %c\n", (int) ch, ch );
}
5 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 93 / 549
Java Tipos Bsicos
Tipos inteiros byte, short, int e long
Por que no simplicar e utilizar somente long?
Modo octal e hexadecimal de atribuio:
Quando se insere 0 antes do nmero indica base octal
Ex: 011 equivale a 9
Quando se insere 0x antes do nmero indica base
hexadecimal
Ex: 0x18 equivale a 24
Atribuir valores fora do limite requer cast, contudo no ativa
exceo (nomenclatura de Java para erro)
Ex: byte b = (byte) 128 atribui -128 a b
Diviso por 0 ativa exceo (ArithmeticException)
Ex: int i = 2/0 ativa exceo em tempo de execuo
(no em compilao)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 94 / 549
Java Tipos Bsicos
Exemplo Atribuio
1 public static void main( String[] args ) {
int i1 = 17;
3 int i2 = 021;
int i3 = 0x11;
5
System.out.printf( "%d %d %d", i1, i2, i3 );
7 }
Pergunta-se
Qual a sada?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 95 / 549
Java Tipos Bsicos
Tipos de Ponto Flutuante float e double
float preciso simples
Nmero dever conter o ps-xo f ou F
Ex: float f = 9.02f ou float f = 9.02F
double preciso dupla
Atribuio normal: double d = 9.02
Se desejar, nmero pode conter o ps-xo g ou G
Ex: double d = 9.02g ou double d = 9.02G
Pode-se utilizar notao exponecial
Ex: double d = 3.02e2 ou double d = 2.56E-3
No gera exceo em caso de diviso por 0
1.0 / 0.0 gera
-1.0 / 0.0 gera
0.0 / 0.0 gera NaN
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 96 / 549
Java Tipos Bsicos
Exemplo Atribuio
1 public static void main( String[] args ) {
float f = 3.01f;
3 double d1 = -3.01;
double d2 = 3.564e+2;
5
System.out.printf("%g %g %g\n", f, d1, d2);
7
double d3 = 1.0/0;
9 double d4 = 0.0/0;
System.out.printf("%g %g\n", d3, d4);
11 }
Pergunta-se
Qual a sada?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 97 / 549
Java Tipos Bsicos
Converso e Promoo
Promoo implcita (feita automaticamente)
Por exemplo, de int para float
Converso explcita (feita via cast)
Por exemplo, de double para int
Quando se trabalha com operaes com diversos tipos de
variveis, o valor promovido para a de maior
complexidade
Exceto, em operaes entre variveis inteiras inferiores ao
int em que todos os valores so promovidos para int
automaticamente
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 98 / 549
Java Tipos Bsicos
Exemplo
1 public static void main( String[] args ) {
byte b = (byte) 264; /
*
Conversao Forcada
*
/
3 System.out.println( b );
5 short s = (short) 3.5; /
*
Conversao Forcada
*
/
System.out.println( s );
7
int i = b + s; /
*
b e s se promovem para operar
*
/
9 System.out.println( i );
11 float f = 3; /
*
Promocao Implicita
*
/
System.out.println( f );
13
double d = 3 / 2; /
*
Promocao Implicita do Resultado
*
/
15 System.out.println( d );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 99 / 549
Java Tipos Bsicos
Constantes caractere de barra invertida
Para a maioria dos caracteres, as aspas simples funcionam
bem, porm para enter, tab, esc seria bem complicado
represent-los, uma vez que so teclas de ao. Por isto,
Java deniu as constantes especiais de barra invertida
Constantes especiais mais utilizadas
\n Nova Linha
\r Retorno de Carro (CR)
\t Tabulao horizontal
\ Aspas Simples
\" Aspas Duplas
\\ Barra Invertida
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 100 / 549
Java
Operadores
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 101 / 549
Java Operadores
Quatro classes de operadores:
Aritmticos
Relacionais
Lgicos
Bit a bit
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 102 / 549
Java Operadores
Tabela de Prioridades
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 103 / 549
Java Operadores
Operadores Artimticos
+
-

/
% (corresponde ao mod do Pascal)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 104 / 549
Java Operadores
Prioridades e Associatividades normais
Parnteses mudam as prioridades
2 + 2
*
4 != (2 + 2)
*
4
Operador /
Operando inteiros:
Diviso Inteira: (7 / 2 = 3)
Pelo menos um ponto utuante:
Diviso Fracionria:
7.0 / 2.0 = 3.5
7.0 / 2 = 3.5
7 / 2.0 = 3.5
Operador %
Resto de diviso inteira
Ex: 4 % 2 = 0 e 5 % 2 = 1
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 105 / 549
Java Operadores
Operadores Aritmticos em Atribuies Compostas
Em geral, os operadores aritmticos possuem um operador
de atribuio correspondente:
Exemplo:
A = A + 2 A += 2
Outros:
-=
*
=
/=
%=
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 106 / 549
Java Operadores
Exemplo de operadores de atribuio compostos
public static void main( String[] args ) {
2 int valor = 10;
4 valor += 10;
System.out.printf("%d", valor); /
*
valor: ?
*
/
6
valor -= 10;
8 System.out.printf("%d", valor); /
*
valor: ?
*
/
10 valor
*
= 5;
System.out.printf("%d", valor); /
*
valor: ?
*
/
12
valor /= 10;
14 System.out.printf("%d", valor); /
*
valor: ?
*
/
16 valor %= 3;
System.out.printf("%d", valor); /
*
valor: ?
*
/
18 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 107 / 549
Java Operadores
Operadores Aritmticos de incremento e decremento
++ (incrementa 1)
-- (decrementa 1)
Exemplos:
A = A + 1 A += 1 A++ ++A
A = A - 1 A -= 1 A-- --A
Posicionamento (vale para ++ e para --)
++ aps a varivel:
ps-incremento (retorna e incrementa)
++ antes da varivel:
pr-incremento (incrementa e retorna)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 108 / 549
Java Operadores
Exemplos
1
int i = 0;
System.out.printf("%d", i++);
System.out.printf("%d", i);
System.out.printf("%d", --i);
2
int i = 0;
System.out.printf("%d", ++i);
System.out.printf("%d", i);
System.out.printf("%d", i--);
System.out.printf("%d", i);
Pergunta-se
Qual a sada de cada printf?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 109 / 549
Java Operadores
Entendeu mesmo?
1 public static void main( String[] args ) {
int i = 0;
3 System.out.printf( "%d", i++ );
System.out.printf( "%d", i-- );
5 System.out.printf( "%d", --i );
System.out.printf( "%d", i );
7
i = 6;
9 System.out.printf( "%g", ++i / 2.0 );
}
Pergunta-se
Qual a sada de cada printf?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 110 / 549
Java Operadores
Operadores Relacionais:
== (comparao)
!= (diferena)
< > <= >=
Operadores Lgicos:
So eles: & (and), | (or) e ! (not)
Normalmente, para and e or, utiliza-se operadores de curto
circuito que fazem com que a expresso s seja analisada
at que seja possvel determinar o resultado
So eles: && (and) e || (or)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 111 / 549
Java Operadores
Operadores Lgicos de Curto Circuito
Ao encontrarem um valor que determine seu resultado, no
testam mais as outras condies, isto , a expresso s ser
analisada at que seja possvel determinar o resultado
Exemplo: considere que os mtodos a e b retornem booleano
a() & b() executa os dois mtodos para obter o
resultado
a() | b() executa os dois mtodos para obter o
resultado
a() && b() se o mtodo a retornar false, o resultado
ser false e o mtodo b nem ser executado
a() || b() se o mtodo a retornar true, o resultado
ser true e o mtodo b nem ser executado
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 112 / 549
Java Operadores
Entendeu mesmo?
private static boolean a() { return false; }
2
private static boolean b() { return true; }
4
private static boolean c() { return false; }
6
private static boolean d() { return true; }
8
public static void main( String[] args ) {
10 System.out.printf( "%d", a() & b() & c() & d() );
System.out.printf( "%d", a() && b() && c() && d() );
12 System.out.printf( "%d", a() || b() || c() || d() );
}
Pergunta-se
Quais mtodos sero executados e qual o retorno dos printfs
das linhas 10, 11 e 12?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 113 / 549
Java Operadores
Tiro no p!
1 public static void main( String[] args ) {
int a = 0;
3 if ( a != 0 & 2 / a > 5 ) {
System.out.println( "OK" );
5 } else {
System.out.println( "NOK" );
7 }
}
Pergunta-se
O programa acima apresenta um erro fatal. Como evit-lo?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 114 / 549
Java Operadores
Operadores bit a bit:
& (and)
Ex: 3 & 1 0011 & 0001 0001 1
| (or)
Ex: 3 | 1 0011 | 0001 0011 3
(xor)
Ex: 3 1 0011 0001 0010 2
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 115 / 549
Java Operadores
Operadores bit a bit:
~ (complemento de um)
Ex: 3 0011 1100 12
<< (deslocamento esquerda)
Ex: 4 << 1 0100 << 1 1000 8
>> (deslocamento direita)
Ex: 4 >> 1 0100 >> 1 0010 2
>>> (deslocamento direita com sinal)
Ex: -127 >>> 1 2147483584
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 116 / 549
Java Operadores
Desao
public static void main( String[] args ) {
2 int x = 10, y = -2;
4 System.out.println( (-2
*
-1) << 3 );
6 System.out.println( ++x - --y + ((x >> 3) << 2) );
8 System.out.println( (x % 5) << ((4 % 2) + 4) );
}
Pergunta-se
Qual a sada de cada printf?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 117 / 549
Java Operadores
Exerccios
10 & 13 ?
10 | 13 ?
10 13 ?
0 ?
8 1 ?
2 2 ?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 118 / 549
Java
Comandos condicionais
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 119 / 549
Java Comandos condicionais
Comandos condicionais (if, switch e operador ternrio)
Comando condicionais so aqueles que dependendo de
uma condio executam um bloco, caso a condio no
seja atendida, o bloco no ser executado
Java prov suporte a trs comandos condicionais:
if
switch
operador ternrio (? :)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 120 / 549
Java Comandos condicionais
Comandos condicionais - if
Sintaxe do comando if
if ( condicao ) {
comando1;
comando2;
comando3;
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 121 / 549
Java Comandos condicionais
Observaes:
Os parnteses que envolvem a condio so
OBRIGATRIOS
Diferentemente de Pascal, Delphi (Object Pascal) etc
A condio dever retornar um tipo booleano
Os comandos somente sero executados se a condio for
verdadeira
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 122 / 549
Java Comandos condicionais
Comandos condicionais - if
O uso dos braos NO obrigatrio caso seja apenas um
nico comando
Porm, a boa prtica recomenda a utilizao de braos
independente do nmero de comandos
Melhor indentao do cdigo
if ( true ) comando;
equivale a:
if ( true ) {
comando;
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 123 / 549
Java Comandos condicionais
Comandos condicionais - if
Como fao o conhecido:
se verdade ento . . . seno . . .
if ( condicao ) {
comando1;
comando2;
comando3;
} else {
comando4;
comando5;
comando6;
}
Pergunta-se
Quais comandos sero executados se a condio for
verdadeira? E se for falsa?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 124 / 549
Java Comandos condicionais
Comandos condicionais - if
1 int a = Teclado.lerInteger( "Digite a" );
int b = Teclado.lerInteger( "Digite b" );
3
if ( a >= b ) {
5 System.out.printf( "%d e maior ou igual a %d!", a, b );
} else {
7 System.out.printf( "%d e menor que %d!", a, b );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 125 / 549
Java Comandos condicionais
Comandos condicionais - if
Comando if podem ser aninhados
1 int nota = Teclado.lerInteger( "Digite uma nota de 0 a 100" );
3 if ( nota >= 90 ) {
System.out.println( "Nota A" );
5 } else if ( nota >= 80 ) {
System.out.println( "Nota B" );
7 } else if ( nota >= 70 ) {
System.out.println( "Nota C" );
9 } else {
System.out.println( "Reprovado" );
11 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 126 / 549
Java Comandos condicionais
Exemplo if
char op = Teclado.lerChar( "Digite um operador (+-/
*
)" );
2
if ( op == + || op == - ) {
4 System.out.println( "Op. Baixa Prioridade.\n" );
} else if ( op == / || op ==
*
) {
6 System.out.println( "Op. Alta Prioridade.\n" );
} else {
8 System.out.println( "Caractere Invalido!\n" );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 127 / 549
Java Comandos condicionais
Comandos condicionais - switch
Na instruo switch, uma varivel de tipo primitivo char ou
int comparada com cada valor em questo. Se um
valor coincidente achado, a instruo (ou instrues)
depois do teste executada
Sintaxe:
switch( variavel ){
case 1: comandoA; break;
case 2: comandoB; break;
case 3: comandoC; break;
default: comandoPadrao;
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 128 / 549
Java Comandos condicionais
Comandos condicionais - switch
Se nenhum valor for encontrado, a instruo default
executada
O comando break necessrio para quebrar o switch,
pois assim que encontrada a opo correta, executado
tudo em seguida
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 129 / 549
Java Comandos condicionais
Comandos condicionais - switch
char letra = B;
2
switch ( letra ) {
4 case A: System.out.println( "Entrou em A" ); break;
case B: System.out.println( "Entrou em B" );
6 case C: System.out.println( "Entrou em C" ); break;
case D: System.out.println( "Entrou em D" ); break;
8 default: System.out.println( "Entrou em Default" );
}
Pergunta-se
Qual a sada?
E se o valor de letra fosse C? E se fosse a?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 130 / 549
Java Comandos condicionais
Comandos condicionais - switch
char letra = B;
2
switch ( letra ) {
4 default: System.out.println( "Entrou em Default");
case A: System.out.println( "Entrou em A" ); break;
6 case B: System.out.println( "Entrou em B" ); break;
case C: System.out.println( "Entrou em C" ); break;
8 case D: System.out.println( "Entrou em D" ); break;
}
Pergunta-se
Qual a sada?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 131 / 549
Java Comandos condicionais
Comandos condicionais - switch
char letra = b;
2
switch ( letra ) {
4 case A: System.out.println( "Entrou em A" ); break;
case B: System.out.println( "Entrou em B" ); break;
6 default: System.out.println( "Entrou em Default");
case C: System.out.println( "Entrou em C" ); break;
8 case D: System.out.println( "Entrou em D" ); break;
}
Pergunta-se
Qual a sada?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 132 / 549
Java Comandos condicionais
Exemplo switch
char op = Teclado.lerChar( "Digite um operador (+-/
*
)" );
2
switch (op){
4 case +:
case -: System.out.println( "Op. Baixa Prioridade.\n" ); break;
6 case
*
:
case /: System.out.println( "Op. Alta Prioridade.\n" ); break;
8 default: System.out.println( "Caractere Invalido!\n" );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 133 / 549
Java Comandos condicionais
Comandos condicionais - Operador Ternrio
Existem situaes cujo uso do if no elegante
Por exemplo, suponha que a funo max retorne o maior
nmero dentre os dois passados via parmetros formais
private static int max( int a, int b ) {
2 if ( a > b ) {
return a;
4 } else {
return b;
6 }
}
8
public static void main( String[] args ) {
10 System.out.printf( "%d", max( 3, 7 ) );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 134 / 549
Java Comandos condicionais
Comandos condicionais - Operador Ternrio
O operador ternrio uma expresso, signicando que ele
devolve um valor
O operador ternrio muito til para condicionais (curtas e
simples) e tem o seguinte formato:
varivel = <condio> ? seTrue : seFalse;
A condio pode estar envolvida entre parnteses para
facilitar a leitura, contudo no obrigatrio
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 135 / 549
Java Comandos condicionais
Exemplos:
int a = 2;
int b = 3;
int c = ( a > b ) ? a : b;
Indica que se a for maior que b, c recebe o valor de a, caso
contrrio, c recebe o valor de b, isto , c recebe o maior
valor (a ou b)
Pergunta-se
Qual o valor das variveis abaixo:
int peso = ( 2 != 2 ) ? 80 : 63;
char letra = ( 1 == 1 ) ? R : T;
String result = ( max( a, b ) > 10 ) ? "a ou b > 10" : "a e b < 10";
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 136 / 549
Java Comandos condicionais
Comandos condicionais - Operador Ternrio
No necessariamente o retorno do operador ternrio deve
ser atribudo a uma varivel
Por exemplo, seu retorno pode ser o retorno de uma funo
como faz a funo max com operador ternrio:
private static int max( int a, int b ) {
return (a > b) ? a : b;
}
Ou mesmo o retorno pode servir como parmetro de
chamada de uma funo:
System.out.println( (a > b) ? "a maior!" : "b igual ou menor!" );
System.out.printf( "%d", (a > b) ? a : b );
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 137 / 549
Java
Comandos de repetio
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 138 / 549
Java Comandos de repetio
Comandos repetio (while, do...while e for)
Comandos de repetio so utilizados para repetir um
bloco de cdigo
Java prov suporte a trs comandos de repetio:
while (enquanto)
do...while (faa...enquanto)
for (para)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 139 / 549
Java Comandos de repetio
Comandos repetio - while
O comando while utilizado para repetir um bloco de
acordo com uma condio
considerado um loop de pr-teste
Isto , testa a condio antes de executar o bloco
Sintaxe:
while ( condicao ) {
comando1;
comando2;
comandoN;
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 140 / 549
Java Comandos de repetio
Comandos repetio - while
int i = 0;
while ( i < 10 ) {
System.out.printf( "%d", ++i );
}
Pergunta-se
Qual a sada?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 141 / 549
Java Comandos de repetio
Comandos repetio - do...while
O comando do...while semelhante ao while, contudo
um comando de repetio de ps-teste
Isto , somente ao nal da execuo do bloco que se
verica a condio
Geralmente, utilizado quando se deseja testar a
condio somente a partir da segunda iterao
Por exemplo, uma leitura da opo de um menu. Pede para
digitar uma primeira vez. Somente se no digitar uma opo
vlida que pede para digitar novamente
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 142 / 549
Java Comandos de repetio
Sintaxe:
do {
comando1;
comando2;
comandoN;
} while ( condicao );
Observe o ponto-e-vrgula aps os parnteses da condio. No o esquea!
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 143 / 549
Java Comandos de repetio
Comandos repetio - do...while
1 int i = 0;
3 do {
System.out.printf( "%d", ++i );
5 } while ( 1 != 1 );
Pergunta-se
Qual a sada?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 144 / 549
Java Comandos de repetio
Exemplo
int i;
2
do {
4 i = Teclado.lerInteger( "Digite um numero entre 0 e 10: " );
} while ( i < 0 || i > 10 );
6
System.out.printf( "Numero digitado: %d\n", i );
Pergunta-se
Qual a sada?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 145 / 549
Java Comandos de repetio
Comandos de repetio - for
Comando de repetio mais poderoso da linguagem
composta por:
Inicializao: executado uma nica vez no incio do loop
Condio: executado sempre antes de cada iterao. Se
verdadeira, o bloco executado. Se falsa, nalizado
Operao : executado sempre ao trmino de cada iterao
Sintaxe
for ( inicializacao ; condicao ; operacao ) {
comando1;
comando2;
...
comandoN;
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 146 / 549
Java Comandos de repetio
Exemplo
for ( int i = 0; i < 10; i++ ) {
2 System.out.printf( "%d", i );
}
Pergunta-se
Qual a sada?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 147 / 549
Java Comandos de repetio
Sintaxe
No lao for, a inicializao, condio e operao so
todas opcionais
Exemplo
int i = 0;
2
for ( ; ; ) { /
*
Sem condicao, admite-se sempre verdade
*
/
4 System.out.printf( "%d", ++i );
}
Pergunta-se
Qual a sada?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 148 / 549
Java Comandos de repetio
Comandos de repetio - for
Podemos ter um for dentro de outro, e outro dentro de
outro, e outro dentro de outro...
for ( int i = 0; i <= 2; i++ ) {
2 for ( int j = 0; j < 2; j++ ) {
System.out.printf( "%d %d", i, j );
4 }
}
Pergunta-se
Qual a sada?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 149 / 549
Java Comandos de repetio
Comandos de repetio - for
Um comando for pode ter vrias inicializaes, uma
condio complexa e vrias operaes
Exemplo
for ( int i = 1, d = 2
*
i; i <= 10 || d == 22; i++, d = i
*
2 ) {
2 System.out.printf( "%d - %d\n", i, d );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 150 / 549
Java Comandos de repetio
Comando break
Inserido dentro de um bloco de repetio (pode tambm
ser while ou do...while)
Caso seja executado, o bloco de repetio nalizado
Exemplo
int i = 0;
2
for ( ; i < 10; i++ ) {
4 if ( i == 3 ) {
break;
6 }
System.out.printf( "%d", i );
8 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 151 / 549
Java Comandos de repetio
Comando continue
Inserido dentro de um bloco de repetio
Caso seja executado, a iterao atual do bloco de
repetio interrompida e parte para a prxima iterao
Exemplo
1 for ( int i = 0; i < 10; i++ ) {
if ( i == 3 || i == 5 ) {
3 continue;
}
5 System.out.printf( "%d", i );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 152 / 549
Java Comandos de repetio
Comando de repetio - for
Logicamente, pode-se utilizar break e continue
conjuntamente
Exemplo
1 for ( int i = 0; i < 3; i++ ) {
if ( i == 1 ) {
3 continue;
}
5 for ( int j = 0; j < 2; j++ ) {
System.out.printf( "%d %d\n", i, j );
7 break;
}
9 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 153 / 549
Java Comandos de repetio
Comando de repetio rotulados
Como Java no possui a instruo goto, ele permite que
rotule um loop com um nome e assim aplique operaes
como break e continue sobre um loop especco, isto ,
que no seja o mais interno
Por exemplo, dependendo uma certa condio de um
bloco mais interno, voc quer quebrar ou continuar a partir
do bloco mais externo
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 154 / 549
Java Comandos de repetio
Exemplo
externo:
2 for (int i = 0; i < 3; i++ ) {
for (int j = 0; j < 3; j++ ) {
4 if ( i == 1 && j == 1 ) {
break externo;
6 }
System.out.printf( "%d %d\n", i, j );
8 }
}
Pergunta-se
Qual a sada?
E se fosse simplesmente break?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 155 / 549
Java Comandos de repetio
Comandos de repetio foreach
Existe uma sintaxe para o comando for especca para
iterao de arranjos, colees etc
Esse for conhecido como foreach e abordado logo
que falarmos sobre arranjos
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 156 / 549
Java
Arranjos
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 157 / 549
Java Arranjos
Arranjos - Conceito
Arranjos tambm conhecidos como vetor, array etc so
colees de um mesmo tipo em sequncia
Arranjos podem ser de tipos primitivos (char, int, float,
double), de objetos, de um outro arranjo, de enumerao...
Pode se ter um arranjo de inteiros ou um arranjo de
caracteres ou um arranjo de arranjo de pontos utuantes
Contudo, no se pode ter um arranjo que contenha inteiros
e pontos utuantes
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 158 / 549
Java Arranjos
Arranjos - Declarao
Declarao:
int notas[]; /
*
Arranjo de inteiros
*
/
char letras[]; /
*
Arranjo de caracteres
*
/
String nomes[]; /
*
Arranjo de strings
*
/
A ordem dos colchetes no importa, s no pode ser antes
do tipo:
String nomes[];
String []nomes;
String[] nomes;
[]String nomes; /
*
ERRADO
*
/
Observe que isso s a declarao, isto , no alocado
espao algum para os elementos do arranjo
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 159 / 549
Java Arranjos
Arranjos - Instanciao
Instanciao utilizando o operador new:
int notas[] = new int[5]; /
*
Alocado 5 inteiros
*
/
char letras[] = new char[10]; /
*
Alocado 10 caracteres
*
/
String nomes[] = new String[100]; /
*
Alocado 100 strings
*
/
Ao contrrio de linguagens como C, os elementos do
arranjo SO inicializados automaticamente como a seguir:
Inteiros Flutuantes Boolean Objetos
Inicializados
com:
0 0.0 false null
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 160 / 549
Java Arranjos
Arranjos - Instanciao
Pode-se inicializar um arranjo j inserindo valores:
int notas[] = { 1, 2, 3, 4, 5 };
char letras[] = { A, B, C };
String nomes[] = { "Ricardo", "Virglio", "Ralph" };
A notao acima mais simples, contudo pode ser mais
formal:
int notas[] = new int[] { 1, 2, 3, 4, 5 };
char letras[] = new char[] { A, B, C };
String nomes[] = new String[] { "Ricardo", "Virglio", "Ralph" };
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 161 / 549
Java Arranjos
Arranjos - Declarao
Um arranjo de tamanho n, tem suas posies indexadas de
0 a n-1. Exemplo:
int notas[] = {8,7,8,9,3};
notas[3] = 7;
System.out.printf("%d",notas[4]);
Para obter o tamanho de um arranjo, basta utilizar o
atributo lenght. Exemplo:
int tam = notas.length;
Caso se indexe uma posio no vlida, uma exceo em
tempo de execuo (ArrayIndexOutOfBoundsException)
ativada e possivelmente o aplicativo ser abruptamente
encerrado
Veremos excees mais a frente
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 162 / 549
Java Arranjos
Declarando, inicializando e iterando um arranjo de inteiros
1 int notas[] = new int[5];
3 for ( int i = 0; i < notas.length; i++ ) {
notas[i] = Teclado.lerInteger( "Digite notas[" + i + "]" );
5 }
7 for ( int i = 0; i < notas.length; i++ ) {
System.out.printf( "notas[%d] = %d\n", i, notas[i] );
9 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 163 / 549
Java Arranjos
Declarando, inicializando e iterando um arranjo de strings
String nomes[] = new String[5];
2
for ( int i = 0; i < nomes.length; i++ ) {
4 nomes[i] = Teclado.lerString( "Digite nomes[" + i + "]" );
}
6
for ( int i = 0; i < nomes.length; i++ ) {
8 System.out.printf( "nomes[%d] = %s\n", i, nomes[i] );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 164 / 549
Java Arranjos
Arranjos - Acesso aos elementos
Arranjos permite recuperar ou alterar qualquer um de seus
elementos
Os arranjos em Java sempre iniciam-se na posio 0
Isto indica que ele termina em uma posio inferior ao
tamanho (n-1)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 165 / 549
Java Arranjos
Exemplo
char letras[] = new char[10];
2
letras[0] = A; /
*
Atribui a 1a posicao do arranjo
*
/
4 System.out.printf( "%c", letras[0] ); /
*
Imprime a 1a posicao
*
/
6 letras[1] = B;
letras[2] = C;
8 /
*
...
*
/
letras[9] = H;
10 letras[10] = I; /
*
ERRO
*
/
O erro acima ativa uma exceo do tipo
ArrayIndexOutOfBoundsException. Isso pode alterar o
funcionamento normal do programa ou at mesmo
derrub-lo
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 166 / 549
Java Arranjos
Arranjos Multidimensionais
Pode-se criar um arranjo de arranjos
O mais comum o bidimensional que vemos como uma
matriz
A declarao somente acrescentar o nmero de colunas
Por exemplo: int matriz[][] = new int[4][3]
declara-se uma matriz de 4 linhas e 3 colunas
int matriz[][] = {{1,0,0}, {0,1,2}, {2,3,4}, {0,6,7}};
Representao:
1 0 0
0 1 2
2 3 4
0 6 7
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 167 / 549
Java Arranjos
Arranjo Bidimensional - Exemplo
Criando uma matriz 3x2, zerando e setando valores
1 int matriz[][] = new int[3][2]; /
*
Declara uma matriz 3x2
*
/
3 for ( int i = 0; i < matriz.length; i++ ) {
for ( int j = 0; j < matriz[i].length; j++ ) {
5 matriz[i][j] = 0;
}
7 }
9 matriz[0][0] = 1; /
*
Atribui o valor 1 ao canto superior esquerdo
*
/
matriz[2][1] = 7; /
*
Atribui o valor 7 ao canto inferior direito
*
/
matriz
1 0
0 0
0 7
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 168 / 549
Java Arranjos
Arranjo Bidimensional Curiosidade
Pode-se criar uma matriz com cada linha de um tamanho
1 int matriz[][]= new int[3][]; /
*
Cria uma matriz com 3 linhas
*
/
matriz[0]= new int[4]; /
*
Atribui 4 colunas a linha 0
*
/
3 matriz[1]= new int[1]; /
*
Atribui 1 colunas a linha 1
*
/
matriz[2]= new int[2]; /
*
Atribui 2 colunas a linha 2
*
/
matriz
0 0 0 0
0
0 0
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 169 / 549
Java Arranjos
Exemplo Completo
Leitura de cada elemento de uma matriz 2x3 e posterior
impresso
1 int matriz[][] = new int[2][3];
3 for ( int i = 0; i < matriz.length; i++ ) {
for ( int j = 0; j < matriz[i].length; j++ ) {
5 matriz[i][j] = Teclado.lerInteger(
"Digite matriz[ " + i + "]" + "[" + j + "]" );
7 }
}
9
for ( int i = 0; i < matriz.length; i++ ) {
11 for ( int j = 0; j < matriz[i].length; j++ ) {
System.out.printf( "%d\t", matriz[i][j] );
13 }
System.out.println();
15 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 170 / 549
Java Arranjos
Comandos de repetio foreach
Para iterar um arranjo ou uma coleo, geralmente
fazemos um for bem conhecido:
String nomes[] = { "Ricardo", "Virgilio", "Ralph" };
for ( int i = 0; i < nomes.length; i++ ) {
String nomeAtual = nomes[i];
System.out.println( nomeAtual );
}
Como esse era um for bem comum, Java prov o foreach
que um for com sintaxe simplicada:
String nomes[] = { "Ricardo", "Virgilio", "Ralph" };
for ( String nomeAtual : nomes ) {
System.out.println( nomeAtual );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 171 / 549
Java
Mtodos
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 172 / 549
Java Mtodos
At agora, estamos trabalhando com a linguagem Java
como se fosse uma linguagem estruturada, isto , sem a
orientao a objetos
Criamos uma classe com o mtodo main e fazemos tudo
dentro desse mtodo
No entanto, mesmo sem termos aprofundado nos conceitos
de POO, seria interessante para a familiarizao com a
linguagem que o mtodo main chamasse outros mtodos a
m de deixar o cdigo fonte mais claro e organizado
Convm salientar que essa s uma viso aplicada de
mtodos quando se trabalha com Java como uma
linguagem estruturada
Quando abordarmos os conceitos de POO, vamos
aprofundar bem mais
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 173 / 549
Java Mtodos
Mtodo
Sintaxe:
[visib] [mod] retorno nome ( < param {, param} > ) { corpo }
visib = visibilidade (private, protected ou public)
mod = modicadores (static, final, )
Exemplos
private static void imprimir() { ... }
protected int dobro(int x) { ... }
public double somar(double a, double b) { ... }
private void listar(int notas[]) { ... }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 174 / 549
Java Mtodos
Diretrizes (por enquanto)
Modicador static
Como o mtodo main um mtodo esttico, todos os
mtodos que iremos criar, por enquanto, sero estticos
Lembrem-se que um membro (atributo ou mtodo) esttico
s acessa membros estticos
Visibilidade private
O mtodo main pblico, justamente porque a JVM deve
ter permisso para acess-lo e iniciar a aplicao
Por enquanto, os mtodos que vocs criarem somente sero
visveis pela prpria classe
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 175 / 549
Java Mtodos
Exemplo
1 public class Bhaskara {
3 public static void main( String[] args ) {
...
5 double d = Math.pow( b, 2 ) - 4
*
a
*
c;
...
7 }
}
Pergunta-se
Porque o clculo de delta no pode ser um mtodo separado
para deixar o cdigo mais legvel?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 176 / 549
Java Mtodos
Exemplo
public class Bhaskara {
2
public static void main( String[] args ) {
4 ...
double d = delta( a, b, c );
6 ...
}
8
private static double delta( double a, double b, double c ) {
10 return Math.pow( b, 2 ) - 4
*
a
*
c;
}
12 }
Resumo
Agora, delta um mtodo privado e esttico que pode ser
invocada por qualquer mtodo da classe Bhaskara
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 177 / 549
Java Mtodos
Um programa Java uma coleo de classes
Classes podem conter diversos mtodos
A ordem de declarao no importa (ao contrrio da
linguagem C)
Pelo menos uma classe deve possuir o mtodo esttico
main
a partir dele que a aplicao se inicia
Um mtodo pode:
receber parmetros
declarar variveis locais
conter instrues executveis
retornar um valor
ativar exceo
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 178 / 549
Java Mtodos
Exemplo
public class Soma {
2
public static void main( String args[] ) {
4 int a = 2, b = 3, total;
total = soma( a, b );
6 System.out.printf( "Soma: %d", total );
8 }
10 private static int soma( int x, int y ) {
return x + y;
12 }
14 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 179 / 549
Java Mtodos
Retorno de mtodos
Um mtodo pode retornar valores de qualquer tipo, exceto
outros mtodos
Um mtodo que retorna nada, deve ter seu retorno
declarado como void
A expresso que segue o return o valor retornado
no se deve colocar parnteses
return x+y; e no return (x+y);
O valor de retorno pode ser ignorado
Trmino de mtodos
Ao encontrar a chave de fechamento
Ao ser retornado (return)
Ao ativar uma exceo
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 180 / 549
Java Mtodos
Exemplo
public class ImprimeNome {
2
public static void main( String args[] ) {
4 String nome = "Ricardo";
imprimeRetornandoTamanho( nome );
6 }
8 private static int imprimeRetornandoTamanho( String nome ) {
System.out.println( nome );
10 return nome.length();
}
12
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 181 / 549
Java Mtodos
Exerccios
fatorial
escreveMaior
Recebe n e imprime: n > n-1 > n-2 > > 1 > 0
retornaMenorElemento
retornaMaiorElemento
retornaMedia
Fazer com for e com foreach
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 182 / 549
Java Mtodos
Soluo fatorial
1 public class Fatorial {
3 public static void main( String args[] ) {
int n = Teclado.lerInteger( "Digite n" );
5 System.out.printf( "%d! = %d", n, fat( n ) );
}
7
private static long fat( int n ) {
9 long res = 1;
if ( n == 0 || n == 1 ) {
11 return 1;
}
13 for ( int i = 2; i <= n; i++ ) {
res
*
= i;
15 }
return res;
17 }
19 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 183 / 549
Java Mtodos
Soluo escreveMaior
public class EscreveMaior {
2
public static void main( String args[] ) {
4 int n = Teclado.lerInteger( "Digite n" );
escreveMaior( n );
6 }
8 private static void escreveMaior( int n ) {
for ( int i = n; i >= 0; i-- ) {
10 System.out.printf( "%d ", i );
System.out.printf( (i > 0) ? "> " : "\n" );
12 }
}
14
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 184 / 549
Java Mtodos
Soluo retornaMenor
public class MenorElemento {
2
public static void main( String args[] ) {
4 int v[] = { 2, 4, 5, 1, 3 };
System.out.printf( "Menor el.: %d", retornaMenor( v ) );
6 }
8 private static int retornaMenor( int v[] ) {
int menor = v[0];
10 int tam = v.length;
for ( int i = 1; i < tam; i++ ) {
12 if ( v[i] < menor ) {
menor = v[i];
14 }
}
16 return menor;
}
18
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 185 / 549
4. POO Contedo
1
Introduo 3
2
UML 22
3
Java 62
4
POO 186
Conceitos Iniciais 187
Classe java.lang.Object 216
Herana 232
Modicadores 264
Interface 294
Herana Mltipla? 310
Classe Abstrata x Interface 317
Exceo 320
5
Padres de Projeto 359
6
Tpicos Relevantes 389
7
Materiais Complementares 420
8
Extras 510
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 186 / 549
POO
Conceitos Iniciais
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 187 / 549
POO Conceitos Iniciais
Classe
Como j foi abordado, uma classe encapsula
caractersticas comuns a grupos de objetos. (Mike
ODocherty, 2005)
Pode ser pensada como uma receita de bolo
Ela diz que tem tamanho, sabor e recheio. O que realmente
pequeno, de chocolate e recheado de morango um
objeto da classe (ou instncia da classe)
Em OO, uma classe a menor unidade modular, isto , tudo
deve estar inserido em uma classe
Uma classe possui:
Atributos (propriedades)
Construtores (um tipo especial de mtodo para criao de objetos)
Mtodos (comportamentos)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 188 / 549
POO Conceitos Iniciais
Declarao de uma Classe
public class Conta {
...
}
Padro BluePrints
Classes sempre devem iniciar com a 1
a
letra em caixa alta.
Por exemplo:
Conta, Bhaskara ...
Demais palavras em caixa baixa salvo incio de novas
palavras. Por exemplo:
GuardaChuva, ContaCorrente ...
Sempre evitem (no usem) caracteres especiais ao
programar:
_, -, , , , , ...
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 189 / 549
POO Conceitos Iniciais
Atributo
Sintaxe:
[visib] [mod] tipo nome { = valor-inicial }
visib = visibilidade (private, protected ou public)
mod = modicadores (static, final, ...)
Exemplos
public String nome;
private double salario = 1000.00;
protected int nota;
double cor;
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 190 / 549
POO Conceitos Iniciais
Modicadores
final
Torna o atributo imutvel
static
Torna o atributo esttico, isto , pertence classe
Exemplos
/
*
O cpf nunca ser alterado
*
/
private final long cpf;
/
*
Taxa de rendimento compartilhada entre todos
os objetos do tipo ContaPoupanca
*
/
private static double taxaRendimento;
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 191 / 549
POO Conceitos Iniciais
Declarao de atributos na classe Conta
public class Conta {
2 private static int autoIncremento = 1;
private final int numero;
4 private double saldo;
private Correntista correntista;
6 ...
}
Padro BluePrints
Atributos sempre devem iniciar com a 1
a
letra em caixa
baixa. Por exemplo:
saldo, nome ...
Demais letras em caixa baixa salvo incio de novas palavras.
Por exemplo:
nomeCompleto, registroGeral ...
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 192 / 549
POO Conceitos Iniciais
Mtodo
Sintaxe:
[visib] [mod] retorno nome ( < param {, param} > ) { corpo }
visib = visibilidade (private, protected ou public)
mod = modicadores (static, final, )
Exemplos
private static void imprimir() { ... }
public double somar(double a, double b) { ... }
private void listar(int notas[]) { ... }
Padro BluePrints
Mesma regra de atributos
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 193 / 549
POO Conceitos Iniciais
Declarao de mtodos na classe Conta
1 public class Conta {
...
3 public int getNumero() {
return this.numero;
5 }
7 public Correntista getCorrentista() {
return this.correntista;
9 }
11 public void setCorrentista( Correntista correntista ) {
this.correntista = correntista;
13 }
15 public double getSaldo() {
return this.saldo;
17 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 194 / 549
POO Conceitos Iniciais
Declarao de mtodos na classe Conta
1 public boolean retirar( double valor ) {
if ( valor <= this.saldo ) {
3 this.saldo -= valor;
return true;
5 }
return false;
7 }
9 public void depositar( double valor ) {
this.saldo += valor;
11 }
13 public boolean transferir( Conta contaDestino, double valor ) {
if ( this.retirar( valor ) ) {
15 contaDestino.depositar( valor );
return true;
17 }
return false;
19 }
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 195 / 549
POO Conceitos Iniciais
Declarao de mtodos na classe Conta
public class Conta {
2 ...
public int getNumero() {
4 return this.numero;
}
6
public Correntista getCorrentista() {
8 return this.correntista;
}
10
public void setCorrentista( Correntista correntista ) {
12 this.correntista = correntista;
}
14
public double getSaldo() {
16 return this.saldo;
}
18
public boolean retirar( double valor ) {
20 if ( valor <= this.saldo ) {
this.saldo -= valor;
22 return true;
}
24 return false;
}
26
public void depositar( double valor ) {
28 this.saldo += valor;
}
30
public boolean transferir( Conta contaDestino, double valor ) {
32 if ( this.retirar( valor ) ) {
contaDestino.depositar( valor );
34 return true;
}
36 return false;
}
38 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 196 / 549
POO Conceitos Iniciais
Construtor
Tipo especial de mtodo responsvel pela criao de
objetos
Por exemplo, como eu crio uma conta? Como eu crio um
correntista?
Se voc no cria um construtor, Java cria um vazio para
voc. Esse construtor somente permite que voc crie
objetos daquela classe utilizando o operador new
Contudo, se voc cria um construtor, Java no mais cria um
vazio para voc
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 197 / 549
POO Conceitos Iniciais
Construtor
Sintaxe:
[visib] nome-da-classe ( < param {, param} > ) { corpo }
Diretrizes
SOMENTE chamado na criao de um novo objeto
SEMPRE possui o mesmo nome da classe
NO possui tipo de retorno
GERALMENTE pblico
Observao
Atributos final devem SEMPRE ser inicializado em um
construtor
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 198 / 549
POO Conceitos Iniciais
Declarao de construtores na classe Conta
1 public class Conta {
...
3 public Conta(Correntista correntista) {
this( correntista, 0.0 );
5 }
7 public Conta(Correntista correntista, double saldo) {
this.correntista = correntista;
9 this.numero = autoIncremento++;
this.saldo = saldo;
11 }
...
13 }
Observao
A instruo this( correntista, 0.0 ) invoca o outro
construtor passando o correntista e 0.0
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 199 / 549
POO Conceitos Iniciais
Declarao de construtores na classe Correntista
public class Correntista {
2 private final long cpf;
private String nome;
4
public Correntista(long cpf, String nome) {
6 this.cpf = cpf;
this.nome = nome;
8 }
10 public long getCpf() {
return this.cpf;
12 }
14 public String getNome() {
return this.nome;
16 }
18 public void setNome( String nome ) {
this.nome = nome;
20 }
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 200 / 549
POO Conceitos Iniciais
Criando objetos
Um objeto a concretizao de uma classe
Em outras palavras, a instanciao de uma classe
O operador new permite que objetos sejam criados a partir
de uma classe. Por exemplo:
String s = new String("Java doido demais!");
Date data = new Date( );
Animal girafa = new Girafa("Melman", new Mania("Doena"));
O operador new aloca memria no heap da JVM e cria a
estrutura bsica de um objeto da classe
Bem mais fcil que em C
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 201 / 549
POO Conceitos Iniciais
Pergunta-se
Suponha uma classe hipottica X em que no foi denido
nenhum construtor
Como criar um objeto dessa classe?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 202 / 549
POO Conceitos Iniciais
Pergunta-se
Suponha uma classe hipottica X em que no foi denido
nenhum construtor
Como criar um objeto dessa classe?
Responde-se
new X()
Pois, como no foi criado nenhum construtor, Java cria um
vazio automaticamente
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 202 / 549
POO Conceitos Iniciais
Como criar um objeto da classe Correntista?
A classe Correntista s tem um construtor, logo o nico
modo :
new Correntista( 123, "Ricardo Terra" ) /
*
valores hipotticos
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 203 / 549
POO Conceitos Iniciais
Como criar um objeto da classe Conta?
Inicialmente, qualquer construtor da classe Conta requer
um objeto da classe Correntista. Logo:
Correntista c = new Correntista( 123, "Ricardo Terra" )
Assim:
new Conta( c )
new Conta( c, 1000.00 );
Caso no tenha um objeto da classe Correntista, voc
pode ser um pouco ousado:
new Conta( new Correntista( 456, "Maria" ) )
new Conta( new Correntista( 456, "Maria" ), 1000.00 )
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 204 / 549
POO Conceitos Iniciais
Mtodos Acessores
Na maioria das vezes, opta-se por criar atributos privados e
para modic-los criam-se mtodos acessores (getters e
setters)
Isto faz com que no se tenha acesso direto aos atributos,
mas conseguindo obt-los e modic-los
Esses mtodos acessores seguem o seguinte padro:
Mtodo setter se chama setNomeAtributo. Alm disso,
retorna void e possui um nico parmetro formal do mesmo
tipo do atributo
Mtodo getter se chama getNomeAtributo. Alm disso,
retorna o mesmo tipo do atributo e no possui parmetro
formal
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 205 / 549
POO Conceitos Iniciais
Exemplo Mtodos Acessores em Correntista
1 public class Correntista {
private final long cpf;
3 private String nome;
5 public Correntista(long cpf, String nome) {
this.cpf = cpf;
7 this.nome = nome;
}
9
public long getCpf() {
11 return this.cpf;
}
13
public String getNome() {
15 return this.nome;
}
17
public void setNome( String nome ) {
19 this.nome = nome;
}
21 }
Pergunta-se
Onde est o setCpf?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 206 / 549
POO Conceitos Iniciais
Referncia this
this uma referncia ao objeto corrente
um boa prtica, logo deve SEMPRE ser utilizado
Alm de boa prtica, resolve problema de escopos:
1 public class ExemploThis {
private int x = 2;
3
public void m() {
5 int x = 4;
System.out.printf( "%d", x );
7 System.out.printf( "%d", this.x );
}
9 }
Qual a sada?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 207 / 549
POO Conceitos Iniciais
Exemplo Completo
1 public static void main( String[] args ) {
Correntista eu = new Correntista( 123, "Ricardo" );
3 Conta minhaConta = new Conta( eu, 2000 );
5 Conta contaDela = new Conta( new Correntista( 456, "Maria" ) );
7 System.out.printf( "%d %s %.2f\n", minhaConta.getNumero(),
minhaConta.getCorrentista().getNome(), minhaConta.getSaldo() );
9 System.out.printf( "%d %s %.2f\n", contaDela.getNumero(),
contaDela.getCorrentista().getNome(), contaDela.getSaldo() );
11
contaDela.depositar( 500.00 );
13
if ( !contaDela.retirar( 600 ) ) {
15 contaDela.retirar( contaDela.getSaldo() );
}
17
minhaConta.transferir( contaDela, 0.5
*
minhaConta.getSaldo());
19
System.out.printf( "%d %s %.2f\n", minhaConta.getNumero(),
21 minhaConta.getCorrentista().getNome(), minhaConta.getSaldo() );
System.out.printf( "%d %s %.2f\n", contaDela.getNumero(),
23 contaDela.getCorrentista().getNome(), contaDela.getSaldo() );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 208 / 549
POO Conceitos Iniciais
Problemas Comuns (merecem ateno redobrada)
Um atributo final deve ser iniciado uma nica vez e deve
ser feito em um construtor
Por isso, importante utilizar this para chamar um outro
construtor dentro de um construtor
No se utiliza this para acessar um membro (atributo ou
mtodo) esttico (static)
Por exemplo, o atributo esttico autoIncremento ou
utilizado sem this ou Conta.autoIncremento
Um membro esttico no pode utilizar this
Como ele no faz parte de nenhum objeto, um membro
esttico s pode utilizar membros estticos
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 209 / 549
POO Conceitos Iniciais
Problemas Comuns (merecem ateno redobrada)
Suponha que a classe Pessoa no tenha construtor algum
denido. Para criar um objeto do tipo Pessoa, basta:
new Pessoa()
No entanto, suponha que tenha criado um construtor
dizendo que pessoa deve ter um nome. Ento, o nico
modo de criar pessoa agora passando o nome:
new Pessoa( "Ricardo Terra" )
new Pessoa() /
*
no funciona mais
*
/
Lembre-se, Java s cria o construtor vazio se voc no criar
construtor algum
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 210 / 549
POO Conceitos Iniciais
Problemas Comuns (merecem ateno redobrada)
E se eu quiser que uma pessoa possa ser criada sem nada
ou com o nome?
1 public class Pessoa {
private String nome;
3
public Pessoa() {
5 }
7 public Pessoa(String nome) {
this.nome = nome;
9 }
11 public String getNome() {
return nome;
13 }
15 public void setNome( String nome ) {
this.nome = nome;
17 }
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 211 / 549
POO Conceitos Iniciais
Dicas para evitar problemas
No crie mtodo acessor setter para atributos final
No funcionar, eles no mudam
importante inicializar todos os atributos no construtor
Pode gerar problemas como valores indesejados ou
excees (futuro)
Siga a ordem de declarao na classe
Primeiro atributos, depois construtores e depois mtodos
Siga o padro de nomenclatura
Faa comentrios a todo momento
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 212 / 549
POO Conceitos Iniciais
Exerccio de Fixao 01
Pratique os conceitos de OO aprendidos no BlueJ
implementando o seguinte modelo UML:
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 213 / 549
POO Conceitos Iniciais
Exerccio de Fixao 02
Pratique os conceitos de OO aprendidos no BlueJ
implementando o seguinte modelo UML:
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 214 / 549
POO Conceitos Iniciais
Resumo
Classe e Objeto
Declarao de atributos, mtodos e construtores
Associao de classes
Modicadores de visibilidade
Modicador static
Modicador final (em atributos)
Reso
Referncia this
Encapsulamento (mtodos acessores)
Instanciao (operador new)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 215 / 549
POO
Classe java.lang.Object
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 216 / 549
POO Classe java.lang.Object
Em Java, todas as classes so subclasses de
java.lang.Object
Logo, as seguintes declaraes da classe A so
equivalentes:
public class A { ... }
public class A extends Object { ... }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 217 / 549
POO Classe java.lang.Object
Capacidade Polimrca
Isto proporciona a capacidade polimrca de qualquer
classe Java, uma vez que qualquer objeto pode ser tratado
como Object
Na verdade, a capacidade polimrca se d pela herana
Exemplo
1 Object v[] = new Object[] { "String", 2, new A(), new Date() };
3 for ( Object o : v ) {
System.out.println( o );
5 }
Pergunta-se
2 objeto?
Qual ser a sada do programa?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 218 / 549
POO Classe java.lang.Object
Herana
Toda classe Java j possui implementados diversos mtodos
herdados da classe Object
Os seguintes mtodos so os mais relevantes:
equals
hashCode
toString
finalize
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 219 / 549
POO Classe java.lang.Object
Mtodo toString
Assinatura:
public String toString ()
Ao imprimir um objeto, impresso o string retornado por
esse mtodo
Pessoa p = new Pessoa ("Ricardo", 21);
System.out.println( p );
Se esse mtodo no for sobrescrito, ele imprime o nome
qualicado
1
da classe, @ e hashcode
Por exemplo: com.terra.pojo.Pessoa@19821f
No entanto, se sobrescrito, pode retornar o que desejar
Por exemplo: Ricardo tem 21 anos
1
pacote + nome da classe
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 220 / 549
POO Classe java.lang.Object
Mtodo equals
Assinatura:
public boolean equals (Object o)
Basicamente, compara a igualdade de dois objetos
Pessoa p1 = new Pessoa ("Ricardo", 21);
Pessoa p2 = new Pessoa ("Ricardo", 21);
System.out.println( p1.equals( p2 ) );
Se esse mtodo no for sobrescrito, ele verica se ambos
objetos ocupam a mesma posio de memria. Logo, no
exemplo, retornar false
No entanto, se sobrescrito para comparar os valores de seus
atributos, no exemplo, possivelmente retornar true
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 221 / 549
POO Classe java.lang.Object
Mtodo hashCode
Assinatura:
public int hashCode ()
Esse mtodo retorna cdigo hash. Um cdigo hash pode
ser um nmero inteiro, positivo ou negativo. Objetos iguais
tm de retornar cdigos hash idnticos
Indicaes:
Se o mtodo equals sobrescrito, o mtodo hash tambm
deve ser
Uso:
Tabela de Hash
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 222 / 549
POO Classe java.lang.Object
Coletor de Lixo (GC)
Em Java, o gerenciamento de memria realizado
automaticamente por um processo chamado Coletor de
Lixo (Garbage Colletor GC) que executado dentro da
JVM
Voc pode forar a ativao do GC com System.gc()
No entanto, Java poder ignorar
Exemplo
String str = "casa";
str = "carta";
System.gc( ); /
*
talvez ative
*
/
...
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 223 / 549
POO Classe java.lang.Object
Mtodo finalize
Assinatura:
protected void finalize () throws Throwable
Esse mtodo executado no momento em que o coletor
de lixo (GC) vai liberar a memria ocupada pelo objeto
A implementao padro (em Object) vazia. Logo, se
no sobreposto, no faz nada
No entanto, se sobrescrito, pode fazer o que desejar
Por exemplo: fechar uma conexo, dar o ltimo suspiro, se
salvar etc
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 224 / 549
POO Classe java.lang.Object
Mtodo finalize Programa Assassino
Suponha a seguinte classe Deus:
1 public class Deus {
private static Collection<Imortal> protegidos
3 = new HashSet<Imortal>();
5 public static void proteger( Imortal i ) {
protegidos.add( i );
7 }
}
Suponha a seguinte classe Imortal:
1 public class Imortal {
@Override
3 protected void finalize() throws Throwable {
Deus.proteger( this );
5 }
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 225 / 549
POO Classe java.lang.Object
Mtodo finalize Programa Assassino
public class ProgramaAssassino {
2
public static void main( String[] args ) {
4 while (true){
new Imortal();
6 }
}
8
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 226 / 549
POO Classe java.lang.Object
Exemplo Completo Classe Pessoa
1 public class Pessoa {
private String nome;
3 private int idade;
5 public Pessoa(String nome, int idade) {
this.nome = nome;
7 this.idade = idade;
}
9
public String getNome() {
11 return this.nome;
}
13
public void setNome( String nome ) {
15 this.nome = nome;
}
17
public int getIdade() {
19 return this.idade;
}
21
public void setIdade( int idade ) {
23 this.idade = idade;
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 227 / 549
POO Classe java.lang.Object
Exemplo Completo Classe Pessoa
1 @Override
public String toString() {
3 return this.nome + " tem " + this.idade + " anos";
}
5
@Override
7 public void finalize() {
System.out.println( "Bye: " + this );
9 }
11 @Override
public int hashCode() {
13 final int prime = 31;
int result = 1;
15 result = prime
*
result + idade;
result = prime
*
result + ((nome == null) ? 0 : nome.hashCode());
17 return result;
}
19
@Override
21 public boolean equals( Object o ) {
if ( o != null && o instanceof Pessoa ) {
23 Pessoa p = (Pessoa) o;
return p.nome.equals( this.nome ) && p.idade == this.idade;
25 }
return false;
27 }
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 228 / 549
POO Classe java.lang.Object
Exemplo Completo
public static void main( String[] args ) {
2 Pessoa p1 = new Pessoa( "Ralph", 28 );
Pessoa p2 = new Pessoa( "Ralph", 28 );
4 Pessoa p3 = new Pessoa( "Terra", 21 );
Pessoa p4 = new Pessoa( "Virgilio", 40 );
6
System.out.println( p3 );
8
p4 = null;
10 System.gc();
12 System.out.printf( "%s \t %s", p1, p2 );
14 if ( p1.equals( p2 ) ) {
System.out.println( p1 + " eq " + p2 );
16 } else {
System.out.println( p1 + " ne " + p2 );
18 }
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 229 / 549
a.s. e d.s.?
a.s. e d.s.?
a.s. e d.s.?
a.s. e d.s.?
POO Classe java.lang.Object
Importante
Imprimir this o mesmo que imprimir this.toString()
Nunca se esquea:
comparao de tipos primitivos: ==
comparao de objetos: mtodo equals()
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 230 / 549
POO Classe java.lang.Object
Resumo
Classe java.lang.Object
equals
hashCode
toString
finalize
Coletor de Lixo
Sobreposio desses mtodos
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 231 / 549
POO
Herana
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 232 / 549
POO Herana
Modelo 1: Jogo dos 1 erro!!!
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 233 / 549
POO Herana
Modelo 1: Classe Empregado Implementao
public class Empregado {
2 private long cpf;
private String nome;
4
public Empregado(long cpf, String nome){
6 this.cpf = cpf;
this.nome = nome;
8 }
10 /
*
Metodos Acessores
*
/
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 234 / 549
POO Herana
Modelo 1: Classe Gerente Implementao
public class Gerente {
2 private long cpf;
private String nome;
4 private Departamento departamento;
6 public Gerente(long cpf, String nome, Departamento departamento){
this.cpf = cpf;
8 this.nome = nome;
this.departamento = departamento;
10 }
12 /
*
Metodos Acessores
*
/
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 235 / 549
POO Herana
Modelo 1: Classe Departamento Implementao
public class Departamento {
2 private int codigo;
private String nome;
4
public Departamento(int codigo, String nome) {
6 this.codigo = codigo;
this.nome = nome;
8 }
10 /
*
Metodos Acessores
*
/
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 236 / 549
POO Herana
Reetindo...
Um gerente tem tudo que empregado tem!
Logo, possvel?
Empregado e = new Gerente(1, "Ricardo", new Departamento(1,"TI"))
No, mas porqu? Fraca Modelagem OO
Mesmo sabendo-se que um gerente um empregado, no
h nada dizendo isso na modelagem OO
Soluo? Herana!
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 237 / 549
POO Herana
Soluo...
Herana consiste em uma classe herdar todo os membros
(atributos e mtodos) de uma outra classe
Fazer uma modelagem OO adequada ao problema, isto ,
onde um gerente um empregado!
Para isso, no exemplo anterior, a classe Gerente deveria
estender a classe Empregado. Assim:
Gerente ser uma subclasse de Empregado
Empregado ser superclasse de Gerente
Herana habilita a capacidade polimrca
Agora, um gerente pode ser visto como um mero
empregado
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 238 / 549
POO Herana
Modelo 2: A apario da Herana!!!
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 239 / 549
POO Herana
Modelo 2: Classe Departamento Implementao
Nenhuma modicao
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 240 / 549
POO Herana
Modelo 2: Classe Empregado Implementao
1 public class Empregado {
protected long cpf;
3 protected String nome;
5 public Empregado(long cpf, String nome){
this.cpf = cpf;
7 this.nome = nome;
}
9
/
*
Metodos Acessores
*
/
11 }
O que mudou?
Atributos private viram protected
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 241 / 549
POO Herana
Modelo 2: Classe Gerente Implementao
public class Gerente extends Empregado{
2 private Departamento departamento;
4 public Gerente(long cpf, String nome, Departamento departamento){
super(cpf, nome);
6 this.departamento = departamento;
}
8
/
*
Metodos Acessores somente de departamento
*
/
10 }
O que mudou?
Gerente estende Empregado, logo devido a essa extenso:
foram removidos os atributos cpf e nome
foram removidos os mtodos acessores de cpf e nome
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 242 / 549
POO Herana
Modelo 2: Classe Gerente Implementao
1 public Gerente(long cpf, String nome, Departamento departamento){
super(cpf, nome);
3 this.departamento = departamento;
}
E esse super?
Por regra, o construtor de Gerente deve chamar um
construtor de Empregado
Geralmente, Java sempre chama o construtor vazio atravs
de super()
Contudo, Empregado no tem o construtor vazio, portanto
temos que na primeira linha do construtor de Gerente
chamar algum construtor existente em Empregado
Isso logo abordado em mais detalhes
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 243 / 549
POO Herana
Reetindo novamente...
Agora, a modelagem indica que um gerente tem tudo que
empregado tem!
Logo, agora possvel?
Empregado e = new Gerente(1, "Ricardo", new Departamento(1,"TI"))
Sim, mas porqu? Modelagem OO adequada ao problema
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 244 / 549
POO Herana
Exemplo Completo
1 public static void main( String[] args ) {
Empregado e = new Empregado(2, "Virgilio Borges");
3 Gerente g = new Gerente(1, "Ricardo", new Departamento(1,"TI"));
5 Empregado v[] = {e,g};
7 for (Empregado o : v){
System.out.println(o.getCpf() + " " + o.getNome());
9 }
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 245 / 549
POO Herana
Funcionamento dos construtores
Em uma hierarquia, no se pode criar uma especializao
de certa classe sem chamar um construtor de sua
superclasse imediata
Caso voc no invoque explicitamente, Java insere uma
chamada padro super() que, na verdade, invoca o
construtor vazio da superclasse imediata
Logo, suponha o seguinte construtor a classe A:
public A() {
}
igual a
public A() {
super(); // invocando o construtor vazio da superclasse
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 246 / 549
POO Herana
Exemplo 1 Iguais!!!
1 public class A {
3 }
1 public class B extends A {
3 }
1 public class A {
3 public A() {
5 }
7 }
1 public class B extends A {
3 public B() {
5 }
7 }
1 public class A {
3 public A() {
super();
5 }
7 }
1 public class B extends A {
3 public B() {
super();
5 }
7 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 247 / 549
POO Herana
Reviso da Capacidade Polimrca
Pode?
A a = new A();
A a = new B();
B b = new B();
B b = new A(); /
*
erro, por acaso A subclasse de B?
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 248 / 549
POO Herana
Nunca me preocupei com construtores. Ignorncia uma
beno!
public class A { }
public class B extends A { }
Claro que no!
A tem um construtor vazio criado por Java!
B tem um construtor vazio criado por Java que chama o
construtor vazio de A!
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 249 / 549
POO Herana
Nunca me preocupei com construtores. Ignorncia mesmo
uma beno!
public class A { }
public class B extends A {
int x;
public B (int x){
this.x = x;
}
}
Claro que no!
A tem um construtor vazio criado por Java!
B pode ter qualquer construtor, pois Java insere
automaticamente uma chamada ao construtor vazio de A
(que existe)!
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 250 / 549
POO Herana
Enm...
Em uma hierarquia, no se pode criar uma especializao
de certa classe sem chamar um construtor de sua
superclasse imediata
Caso voc no invoque explicitamente, Java insere uma
chamada padro super() que, na verdade, invoca o
construtor vazio da superclasse imediata
Concluso: em uma hierarquia, voc s pode deixar de
invocar o construtor da superclasse se, e somente se, a
superclasse tiver um construtor vazio
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 251 / 549
POO Herana
Referncia super
Assim, como this uma referncia prpria classe, super
uma referncia superclasse
Por exemplo:
usamos this() para invocar construtores da prpria classe,
agora usamos super() para invocar construtores da
superclasse
usamos this. para acessar atributos e invocar mtodos da
prpria classe, agora usamos super. para acessar atributos
e invocar mtodos da superclasse
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 252 / 549
POO Herana
Sesso Vale a pena ver de novo: Sobreposio
Voc sobrepe uma operao quando deseja que uma
operao herdada seja realizada diferentemente pela
subclasse
Por exemplo, uma cobra se alimenta de ratos, mas um tipo
especco de cobra (subclasse) se alimenta diferentemente
Assim, necessrio sobrepor o mtodo alimentar:
Classe Cobra
void alimentar (Rato comida) { /
*
mata e come
*
/ }
Classe Cascavel
@Override
void alimentar (Rato comida) { /
*
come mesmo vivo
*
/ }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 253 / 549
POO Herana
Sesso Vale a pena ver de novo: Sobrecarga
Voc sobrecarrega uma operao quando deseja que a
mesma operao tambm seja realizada por entradas
diferentes
Por exemplo, uma cobra se alimenta de ratos, mas um tipo
especco de cobra (subclasse) se alimenta tambm de
ratazanas
Assim, necessrio sobrecarregar o mtodo alimentar:
Classe Cobra
void alimentar (Rato comida) { /
*
mata e come
*
/ }
Classe Cascavel
@Override
void alimentar (Rato comida) { /
*
come mesmo vivo
*
/ }
void alimentar (Ratazana comida) { /
*
come tambm
*
/ }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 254 / 549
POO Herana
Exemplo Completo
Nada como uma aplicao mais prtica para
entendermos melhor...
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 255 / 549
POO Herana
Classe Conta
public class Conta {
protected final Correntista correntista;
protected double saldo;
public Conta(Correntista correntista, double saldo) {
this.correntista = correntista;
this.saldo = saldo;
}
public Conta(Correntista correntista) {
this( correntista, 0.0 );
}
public Correntista getCorrentista() {
return this.correntista;
}
public double getSaldo() {
return this.saldo;
}
/
*
continua
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 256 / 549
POO Herana
Classe Conta
public void depositar( double valor ) {
this.saldo += valor;
}
public boolean retirar( double valor ) {
if ( valor <= this.saldo ) {
this.saldo -= valor;
return true;
}
return false;
}
@Override
public String toString() {
return this.correntista.getNome() + " tem R$" + this.saldo;
}
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 257 / 549
POO Herana
Importante sobre a classe Conta
Observe a visibilidade dos atributos
Observe a chamada entre construtores utilizando this
Observe a sobreposio do mtodo toString
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 258 / 549
POO Herana
Classe ContaCorrente
public class ContaCorrente extends Conta {
private double limite;
public ContaCorrente(Correntista correntista, double saldo, double limite) {
super( correntista, saldo );
this.limite = limite;
}
@Override
public boolean retirar( double valor ) {
if ( valor <= this.saldo + this.limite ) {
this.saldo -= valor;
return true;
}
return false;
}
public void depositar( Cheque cheque ) {
this.saldo += cheque.getValor();
}
@Override
public String toString() {
return super.toString() + " mais limite de R$" + this.limite;
}
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 259 / 549
POO Herana
Importante sobre a classe ContaCorrente
Observe que estende a classe Conta
Logo, deve chamar algum construtor de Conta
E chama: super( correntista, saldo );
Mas, poderia ser tambm: super( correntista );
E se no chamasse nenhum? O que aconteceria?
Observe a sobreposio dos mtodos retirar e toString
Observe a sobrecarga do mtodo depositar
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 260 / 549
POO Herana
Exemplo Completo
public static void main( String[] args ) {
2 Conta c = new Conta( new Correntista( 111, "Fred" ), 25.0 );
ContaCorrente cc = new ContaCorrente( new Correntista( 222, "Luciano" ), 100.00, 1000.00 );
4
System.out.println( c ); /
*
Fred tem R$25.00
*
/
6 System.out.println( cc ); /
*
Luciano tem R$100.00 mais limite de R$1000.00
*
/
8 System.out.println( c.getSaldo() ); /
*
25.00
*
/
System.out.println( "Retirada de R$26.0:" + c.retirar( 26.0 ) ); /
*
false
*
/
10 System.out.println( c.getSaldo() ); /
*
25.00
*
/
12 System.out.println( cc.getSaldo() ); /
*
100.00
*
/
System.out.println( "Retirada de R$ 200,00:" + cc.retirar( 200.00 ) ); /
*
true
*
/
14 System.out.println( cc.getSaldo() ); /
*
-100.00
*
/
16 cc.depositar( 50 );
System.out.println( cc.getSaldo() ); /
*
-50.00
*
/
18
cc.depositar( new Cheque( 60.00 ) );
20 System.out.println( cc.getSaldo() ); /
*
10.00
*
/
22 Object v[] = new Object[] { c, cc };
for ( Object x : v ) {
24 System.out.println( x ); /
*
Mesmo que x.toString()
*
/
}
26 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 261 / 549
Poderia ser x.getSaldo()?
POO Herana
Por que no poderia ser x.getSaldo?
No funciona, porque x est sendo enxergado como
Object
Assim, somente se v as operaes que existem em Object,
pois no se pode garantir que o arranjo s tenha objetos do
tipo Conta (mesmo tendo, nesse caso especco)
Alm disso, importante mencionar que um objeto no se
comporta diferentemente pelo modo como visto
Referindo-me ao caso do toString
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 262 / 549
POO Herana
Resumo
Herana
Viso geral
Funcionamento dos construtores
Sobreposio de mtodos
Sobrecarga de mtodos
Capacidade polimrca (polimorsmo)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 263 / 549
POO
Modicadores
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 264 / 549
POO Modicadores
Modicador final
At agora, vimos o uso do modicador final somente em
atributos. No entanto, o modicador nal pode ser tambm
atribudo a mtodos e classes
Uso do modicador final
Em atributos: atributo ca imutvel
Inicializado uma nica vez no construtor
Em mtodos: mtodo no pode ser sobrescrito
Ter o mesmo comportamento em todas as subclasses
Em classes: classe no pode ter subclasses
Na rvore de heranas, tal classe ser uma folha
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 265 / 549
POO Modicadores
Sesso Vale a pena ver de novo: Modicador final em
atributos
public class Pessoa {
2 private final String nome;
4 public Pessoa(String nome){
this.nome = nome;
6 }
8 public String getNome() {
return nome;
10 }
}
Pergunta-se:
Onde est o setNome?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 266 / 549
POO Modicadores
Modicador final em classes. Pode?
1 public class A {
3 }
1 public class B extends A {
3 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 267 / 549
POO Modicadores
Modicador final em classes. E agora?
1 public final class A {
3 }
1 public class B extends A {
3 }
Pergunta-se:
Por que no pode?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 268 / 549
POO Modicadores
Modicador final em mtodo. Pode?
1 public class A {
public void f(){
3 System.out.println("Opa!");
}
5 }
1 public class B extends A {
@Override
3 public void f() {
System.out.println("Epa!");
5 }
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 269 / 549
POO Modicadores
Modicador final em mtodo. E agora?
public class A {
2 public final void f(){
System.out.println("Opa!");
4 }
}
1 public class B extends A {
@Override
3 public void f() {
System.out.println("Epa!");
5 }
}
Pergunta-se:
Por que no pode??
E ainda, B pode estender A?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 270 / 549
POO Modicadores
Perguntas Interessantes...
1
Se o mtodo equals da classe Object fosse final, o que
aconteceria?
2
E se o mtodo toString da classe Object fosse final, o
que aconteceria?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 271 / 549
POO Modicadores
Modicador abstract
Vimos o conceito de classe abstrata quando aprendemos
UML, em que uma classe que no tem instncias e
utilizada somente como mecanismo de reso e para provr
a capacidade polimrca
Isso verdade, contudo vamos aprofundar mais no uso
desse modicador, inclusive para mtodos
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 272 / 549
POO Modicadores
Uso do modicador abstract
Em atributos: no existe tal conceito
Em mtodos: mtodo no possui implementao
o mtodo e sua classe devero ser abstratos, pois se a classe
contm algum mtodo abstrato, ela deve ser abstrata
deve ser implementado em alguma subclasse concreta, no
necessariamente a subclasse imediata
Em classes: classe no pode ser instanciada (new)
pode ter nenhum ou todos os mtodos abstratos
serve como molde de herana, mecanismo de polimorsmo,
melhorar modelagens etc
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 273 / 549
POO Modicadores
Exemplo Conceitual
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 274 / 549
POO Modicadores
Classe A
Mtodo f abstrato, logo a classe deve ser abstrata
Possui tambm o mtodo g que concreto
public abstract class A {
2 public abstract void f();
4 public void g() {
/
*
...
*
/
6 }
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 275 / 549
POO Modicadores
Classe B1
Classe concreta, pois implementa f
1 public class B1 extends A{
@Override
3 public void f() {
/
*
...
*
/
5 }
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 276 / 549
POO Modicadores
Classe B2
Classe abstrata, pois no implementa f
Mas, sobrepe g e dene um novo mtodo h
public abstract class B2 extends A{
2 @Override
public void g() {
4 /
*
...
*
/
}
6
public void h() {
8 /
*
...
*
/
}
10 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 277 / 549
POO Modicadores
Classe C
Classe concreta, pois implementa f
public class C extends B2{
2 @Override
public void f() {
4 /
*
...
*
/
}
6 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 278 / 549
POO Modicadores
Utilizao Prtica 01
Uma classe pode possuir nenhum mtodo abstrato e ser
abstrata
Isso ocorre quando no se deseja instncias de tal classe
e/ou quando a classe serve como molde de herana
possibilitando a capacidade polimrca
Exemplo
public abstract class A {
2 public void f() {
/
*
...
*
/
4 }
6 public void g() {
/
*
...
*
/
8 }
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 279 / 549
POO Modicadores
Utilizao Prtica 01
Um exemplo clssico dessa utilizao a classe Conta
Uma conta pode ser ContaCorrente ou ContaPoupanca,
mas no simplesmente Conta
Logo, Conta deve ser abstrata
A, com isso, qualquer conta (corrente ou poupana ou
outras) podero ser tratadas como uma simples conta
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 280 / 549
POO Modicadores
Utilizao Prtica 01 Classe Conta com modicadores
1 public abstract class Conta {
/
*
...
*
/
3
public final double getSaldo() {
5 return saldo;
}
7
public final void depositar( double valor ) {
9 this.saldo += valor;
}
11 /
*
...
*
/
13 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 281 / 549
POO Modicadores
Outros exemplos...
Alm de Conta podemos vislumbrar outras classes que se
encaixam nesse cenrio:
Animal
Veiculo
etc
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 282 / 549
POO Modicadores
Utilizao Prtica 02
O que se pode dizer de comum das coisas nos prximos
slides?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 283 / 549
POO Modicadores
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 284 / 549
POO Modicadores
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 284 / 549
POO Modicadores
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 284 / 549
POO Modicadores
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 284 / 549
POO Modicadores
Utilizao Prtica 02
Ento:
Todas so guras!
Todas tm cor!
Todas tm permetro e rea!
Logo, como modelar?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 285 / 549
POO Modicadores
Utilizao Prtica 02 Modelagem pssima!!!
Mas, por qu?
No existe capacidade polimrca
Duplicao de cdigo
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 286 / 549
POO Modicadores
Utilizao Prtica 02 Modelagem muito ruim!!!
Mas, por qu?
Pode-se criar objetos do tipo Figura
Mtodos area e perimetro tem um implementao banal
em Figura e so sobrescritos nas subclasses
Alm disso, nada os obriga a serem sobrescritos
Por exemplo, mtodo perimetro de Circunferencia
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 287 / 549
POO Modicadores
Utilizao Prtica 02 Modelagem ruim!!!
Mas, por qu?
Mtodos area e perimetro tem um implementao banal
em Figura e so sobrescritos nas subclasses
Alm disso, nada os obriga a serem sobrescritos
Por exemplo, mtodo perimetro de Circunferencia
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 288 / 549
POO Modicadores
Utilizao Prtica 02 Modelagem adequada!!!
Mas, por qu?
Existe capacidade polimrca
No existe duplicao de cdigo
Mtodos area e perimetro devem ser sobrescritos nas
subclasses concretas
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 289 / 549
POO Modicadores
Utilizao Prtica 02 adequada Classe Figura
1 public abstract class Figura {
protected final String cor;
3
public Figura(String cor) {
5 super();
this.cor = cor;
7 }
9 public final String getCor() {
return this.cor;
11 }
13 public abstract double perimetro();
public abstract double area();
15 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 290 / 549
Observe que uma classe abstrata pode
ter construtores. Mesmo no podendo criar
instncias, as subclasses devem respeitar como
se constri uma gura
POO Modicadores
Utilizao Prtica 02 adequada Classe Circunferencia
1 public class Circunferencia extends Figura {
private Ponto ponto;
3 private double raio;
5 public Circunferencia(String cor, Ponto ponto, double raio) {
super( cor );
7 this.ponto = ponto;
this.raio = raio;
9 }
/
*
...
*
/
11 @Override
public double area() {
13 return Math.PI
*
Math.pow( this.raio, 2 );
}
15
@Override
17 public double perimetro() {
return 2
*
Math.PI
*
this.raio;
19 }
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 291 / 549
POO Modicadores
Pergunta Interessante...
Uma classe ou mtodo podem ser final e abstract ao
mesmo tempo?
No, mas por qu?
Se for mtodo, no pode sobrescrever o mtodo abstract
por causa do final que diz que uma verso no
implementada do mtodo a ltima verso. Isso no faz
sentido!
Se for classe, no pode ter subclasses por causa do final e
ela no pode ter instncias por causa do abstract. Isso no
faz sentido!
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 292 / 549
POO Modicadores
Pergunta Interessante...
Uma classe ou mtodo podem ser final e abstract ao
mesmo tempo?
No, mas por qu?
Se for mtodo, no pode sobrescrever o mtodo abstract
por causa do final que diz que uma verso no
implementada do mtodo a ltima verso. Isso no faz
sentido!
Se for classe, no pode ter subclasses por causa do final e
ela no pode ter instncias por causa do abstract. Isso no
faz sentido!
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 292 / 549
POO Modicadores
Outra Pergunta Interessante...
Porque no se pode instanciar classes abstratas?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 293 / 549
POO
Interface
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 294 / 549
POO Interface
Problema Motivador
Suponha um sistema de grande porte (10MLOC)
desenvolvido em Java e utilizando SGBD MySql
Suponha ainda que suas classes estejam acopladas
diretamente s classes do MySql
Pergunta-se: E se quiser mudar para outro SGBD?
obteremos essa resposta ao longo desta subseo
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 295 / 549
POO Interface
Interface
Interface no uma classe, mas um conjunto de requisitos
para classes que precisam se adequar ela
Geralmente, o fornecedor de algum servio arma: Se sua
classe estiver em conformidade com uma determinada
interface, ento realizarei o servio
Representaes UML:
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 296 / 549
POO Interface
Interface
Pode ser pensada como uma classe completamente
abstrata em que:
no possui construtores
todos os seus membros (atributos e mtodos) so pblicos
todos os seus atributos so constantes estticas
public static final ...
todos os seus mtodos so abstratos
public abstract ...
Mais importante, uma interface implementada e no
estendida
justamente porque no h o que estender
ainda, uma classe pode implementar n interfaces
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 297 / 549
POO Interface
Interface Sintaxe
Suponha a seguinte interface IMatematica:
Essa interface um contrato, o qual indica que:
clculos que necessitem do PI devem utilizar aquele
declarado na interface
implementaes devem ser capazes de calcular a
hipotenusa de um tringulo e o permetro de uma
circunferncia
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 298 / 549
POO Interface
Interface Sintaxe IMatematica
public interface IMatematica {
2 double PI = 3.141596;
4 double hipotenusa(double a, double b);
6 double perimetroCircunferencia(double raio);
8 }
ou
public interface IMatematica {
2 public static final double PI = 3.141596;
4 public abstract double hipotenusa(double a, double b);
6 public abstract double perimetroCircunferencia(double raio);
8 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 299 / 549
Em atributos, no necessrio colocar
public static final, mas se quiser...
Em mtodos, no necessrio colocar
public abstract, mas se quiser...
POO Interface
Interface Sintaxe Implementaes
Suponha agora que foram desenvolvidas duas
implementaes dessa interface:
1
TerraMatematica: uma implementao da interface
desenvolvida por mim
2
AlunoMatematica: uma implementao da interface
desenvolvida por um aluno
J adiantando, a ideia que a aplicao s conhea
IMatematica, ou seja, funcionar com qualquer
implementao sem impacto aplicao
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 300 / 549
POO Interface
Interface Sintaxe TerraMatematica
public class TerraMatematica implements IMatematica {
2
@Override
4 public double hipotenusa( double a, double b ) {
return Math.sqrt( Math.pow( a, 2 ) + Math.pow( b, 2 ) );
6
};
8
@Override
10 public double perimetroCircunferencia( double raio ) {
return 2
*
PI
*
raio;
12 }
14 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 301 / 549
POO Interface
Interface Sintaxe TerraMatematica
public class AlunoMatematica implements IMatematica {
2
@Override
4 public double hipotenusa( double a, double b ) {
double x = a
*
a + b
*
b;
6 double result = Math.sqrt( x );
return result;
8 };
10 @Override
public double perimetroCircunferencia( double raio ) {
12 double result = 2
*
PI
*
raio;
return result;
14 }
16 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 302 / 549
POO Interface
Interface Sintaxe Exemplo de Uso
public static void main( String[] args ) {
2 IMatematica m = Factory.getMatematica();
4 System.out.printf("Sendo a=3, b=4, h=%.2f\n",
m.hipotenusa( 3, 4 ));
6
System.out.printf("Sendo raio=2.069, perimetro = %.2f",
8 m.perimetroCircunferencia( 2.069 ));
}
Importante
Observe que no se sabe qual a implementao foi
retornada pela fbrica, isto , se abstrai desse detalhe
Assim, pode-se trocar a implementao sem impacto
aplicao
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 303 / 549
POO Interface
Interface Utilidade
A maior utilidade de interfaces sem dvida alguma
desacoplar a aplicao das implementaes
No ltimo exemplo, toda a aplicao conhece apenas a
interface IMatematica sem dependncia direta
implementao utilizada
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 304 / 549
POO Interface
Interface Utilidade
Voltando ao nosso problema motivador, a soluo a
utilizao de interfaces (mais especicamente o princpio
de projeto conhecido como Programao por Interface)
Assim, a Sun Microsystems (hoje Oracle) criou a API JDBC
que dene como deve ser o acesso ao banco de dados
independente do SGBD utilizado
Como fez isso? Por meio da criao de vrias interfaces
Diante disso, as empresas de SGBDs como Oracle, MySql,
IBM etc tiveram que criar implementaes para cada
uma das interfaces da API JDBC
Ao conjunto dessas implementaes dado o nome de
conector (connector)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 305 / 549
POO Interface
Interface Utilidade
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 306 / 549
POO Interface
Interface Exemplo do Pato
O Pato um animal que:
voa, mas voa mal
anda, mas anda mal
nada, mas nada mal
Assim, essas so ideias de funes/atribuies, por exemplo:
urubu tambm voa e nada, mas diferente de um pato
tubaro tambm nada, mas nada diferente de um pato
possvel uma modelagem que permite que um pato
possua essas trs funes/atribuies, isto , possa ser um
voador, um andador e um nadador ao mesmo tempo?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 307 / 549
POO Interface
Interface Exemplo do Pato Soluo
Pode-se implementar diversas interfaces, logo a soluo a
criao de interfaces para cada funo/atribuio:
interface Voador com mtodo voar
interface Andador com mtodo andar
interface Nadador com mtodo nadar
Interface Exemplo do Pato Soluo
public interface Voador { ... }
public interface Andador { ... }
public interface Nadador { ... }
public class Pato extends Ave implements Voador, Andador, Nadador { ... }
public class Urubu extends Ave implements Voador, Andador { ... }
public class Tubarao extends Peixe implements Nadador { ... }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 308 / 549
POO Interface
Interface Exemplo do Pato Soluo
Desse modo, cada classe implementa as interfaces com os
servios que deseja disponibilizar, veja:
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 309 / 549
POO
Herana Mltipla?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 310 / 549
POO Herana Mltipla?
Herana Mltipla
Herana Mltipla consiste em uma classe herdar de mais de
uma classe. Por exemplo:
public Pessoa extends Mamifero, Animal { ... }
public RadioRelogio extends Radio, Relogio { ... }
No entanto, Java no prov herana mltipla. Logo, as
declaraes acima mesmo lgicas e bvias para ns
no so vlidas na linguagem Java
Porm, vlidas em outras linguagens OO, como C++
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 311 / 549
POO Herana Mltipla?
Herana Mltipla
Java optou por no prover herana mltipla devido
complexidade gerada ao compilador
Alguns possveis problemas seriam:
coliso de atributos e mtodos
ambiguidade ao se acessar atributos ou invocar mtodos
complexidade dos construtores
etc
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 312 / 549
POO Herana Mltipla?
Assim...
Na necessidade de herana mltipla, tm-se trs
alternativas bem denidas:
1
No utilizar herana mltipla, isto , remodelar o problema
de forma que no necessite de herana mltipla
convm salientar que no possuir herana mltipla, no
diminui o poder de expresso da linguagem
2
Utilizar herana indireta (se possvel)
isto , se C quer estender A e B, faa C estender B e
B estender A, assim C ser tambm subclasse de A e de B
3
Utilizar interfaces
uma classe pode implementar diversas interfaces
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 313 / 549
POO Herana Mltipla?
Alternativa: Herana Indireta
Dado a herana mltipla de Pessoa:
public Pessoa extends Mamifero, Animal { ... }
Como Mamifero um Animal, pode-se:
public Pessoa extends Mamifero { ... }
public Mamifero extends Animal { ... }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 314 / 549

POO Herana Mltipla?


Alternativa: Interfaces
No entanto, a ltima alternativa no resolve o problema do
Rdio Relgio, simplesmente porque Rdio no um
Relgio nem o contrrio
Assim, a soluo um pouco complicada
1
Criar interfaces para as classes Radio e Relogio
recomenda-se cham-las de IRadio e IRelogio
2
Fazer RadioRelogio estender Radio e implementar
IRelogio (comum estender a mais complexa)
3
Em RadioRelogio, colocar como atributo um objeto do tipo
Relogio
4
Implementar os mtodos de IRelogio redirecionando para
os mtodos do objeto do tipo Relogio
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 315 / 549
POO Herana Mltipla?
Alternativa: Interfaces
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 316 / 549

POO
Classe Abstrata x Interface
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 317 / 549
POO Classe Abstrata x Interface
Diferenciando: Classe Abstrata x Interface
Herdar uma classe abstrata ou uma interface permite a
propriedade polimrca, isto , se aplica o conceito do
um(a)
Por exemplo: A a = new B()
O tipo A pode ser:
uma classe concreta estendida por B
uma classe abstrata estendida por B
uma interface implementada por B
Contudo, existem diversas diferenas entre classes abstratas
e interfaces como pode ser observado no prximo slide
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 318 / 549
POO Classe Abstrata x Interface
Diferenciando: Classe Abstrata x Interface
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 319 / 549
POO
Exceo
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 320 / 549
POO Exceo
Iniciando...
Antes de entrarmos com sintaxe, importante mencionar
que exceo um mecanismo muito poderoso da
linguagem Java
No entanto, deve-se domin-lo para no se fazer mau uso
poderoso, mas pesado e exige muitos recursos
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 321 / 549
POO Exceo
Tratamento de Excees
Associado a robustez
Habilidade do aplicativo em reagir apropriadamente a
situaes anormais, ou melhor, uma circunstncia
excepcional
Circunstncia Excepcional
Diviso por zero (ArithmeticException)
Uso de um ndice invlido em arranjo (ArrayIndexOutOfBoundsException)
Acesso a uma referncia nula (NullPointerException)
Perda de conexo com um BD (SQLException)
Acesso a um arquivo corrompido (IOException)
Estouro de memria ou pilha (OutOfMemoryError e StackOverflowError)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 322 / 549
POO Exceo
Tratamento de Excees
A linguagem Java prov uma forma das excees serem
tratados isoladamente do cdigo que lida com o negcio
da aplicao
O cdigo abaixo ilustra a sintaxe utilizada em Java para
separar o negcio da aplicao do tratamento de falhas
try {
...
/
*
negocio da aplicacao
*
/
...
} catch (PossivelExcecao e){
...
/
*
tratamento da exceo
*
/
...
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 323 / 549
POO Exceo
Tratamento de Excees Premissa
Um mtodo executa ou falha
Se falha, porque ativa uma exceo
Tratamento de Excees Vantagens
Cdigo do negcio separado tratamento de exceo
blocos distintos
Permite propagar excees na pilha de chamada de
funes
Se a chama b que chama c e esse ltimo ativa uma
exceo, tal exceo pode chegar em a
possvel agrupar e diferenciar tipos de erros
hierarquia de exceo (fantstica, veremos no prximo slide)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 324 / 549
POO Exceo
Hierarquia de Exceo
A hierarquia de exceo um bom exemplo de uso de
herana
Um objeto de exceo sempre de uma classe derivada
de java.lang.Throwable
Inclusive, java.lang.Throwable subclasse de
java.lang.Object
Throwable Principais Mtodos
/
*
Retorna uma mensagem detalhada da exceo
*
/
String getMessage()
/
*
Imprime a exceo e ainda toda a pilha de execuo
*
/
void printStackTrace()
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 325 / 549
POO Exceo
Hierarquia de Exceo
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 326 / 549
POO Exceo
Hierarquia de Exceo Classicao
Erros
Subclasses de Error
Impossvel de trat-las, normalmente erros fatais
Excees No Vericveis
Subclasses de RuntimeException
O compilador no requer seu tratamento
Excees Vericveis
As que no so descendem nem de Error nem de
RuntimeException
Devem ser:
Ou tratadas ( try / catch / finally )
Ou progagadas ( throws )
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 327 / 549
POO Exceo
Exceo: Tratada ou Propagada?
Quando uma exceo ativada, existem duas alternativas:
Tratar (resolver o problema)
Progagar (transferir o problema)
Por exemplo: PitiException
Problema Tratar? Propagar?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 328 / 549
POO Exceo
Tratamento de Exceo
try
Bloco Protegido, executado em completo se nada anormal
acontece
catch
Bloco de Tratamento, executado se ocorre uma exceo do
tipo indicado. Nunca o deixe vazio!
Um mesmo bloco protegido pode ter vrias clusulas catch
Assim, o uxo desviado para o bloco catch correspondente
finally
Bloco de Finalizao, sempre executado at mesmo depois
do return de um mtodo
Exceto System.exit()
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 329 / 549
POO Exceo
Tratamento de Exceo Sintaxe
try {
...
...
/
*
bloco protegido
*
/
...
...
} catch (E1 e) {
...
/
*
bloco executado sse E1 for ativada
*
/
...
} catch (E2 e) {
...
/
*
bloco executado sse E2 for ativada
*
/
...
} finally {
...
/
*
bloco sempre executado (ativando ou no qualquer exceo)
*
/
...
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 330 / 549
Pode:
try e catch

try e finally
try, catch

e finally
POO Exceo
Tratamento de Exceo Exemplo 01a
...
try {
a(); b(); c(); d();
} catch (E1 e) {
e(); f();
} catch (E2 e) {
g(); h();
} catch (E3 e) {
i(); j();
}
m(); n();
...
Pergunta-se: Quais mtodos sero executados caso ative...
1
exceo E1 no mtodo a?
2
exceo E3 no mtodo b?
3
exceo E2 no mtodo d?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 331 / 549
POO Exceo
Tratamento de Exceo Exemplo 01b
...
try {
a(); b(); c(); d();
} catch (E1 e) {
e(); f();
} catch (E2 e) {
g(); h();
} catch (E3 e) {
i(); j();
}
m(); n();
...
Pergunta-se
Quais mtodos sero executados caso uma RuntimeException
seja ativada no mtodo c?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 332 / 549
POO Exceo
Tratamento de Exceo Exemplo 02a
...
try {
a(); b(); c(); d();
} catch (E1 e) {
e(); f();
} catch (E2 e) {
g(); h();
} finally {
k(); l();
}
m(); n();
...
Pergunta-se: Quais mtodos sero executados caso ative...
1
exceo E1 no mtodo a?
2
exceo E2 no mtodo d?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 333 / 549
POO Exceo
Tratamento de Exceo Exemplo 02b
...
try {
a(); b(); c(); d();
} catch (E1 e) {
e(); f();
} catch (E2 e) {
g(); h();
} finally {
k(); l();
}
m(); n();
...
Pergunta-se
Quais mtodos sero executados caso uma RuntimeException
seja ativada no mtodo c?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 334 / 549
POO Exceo
Tratamento de Exceo Fins acadmicos
Como j mencionada, as excees no vericveis no
necessitam ser tratadas
No entanto, para ns acadmicos iremos ngir o tratamento
de tais excees apenas para facilitar o entendimento
No nal desta seo, veremos porque no trat-las
Sero utilizadas as mais conhecidas:
Diviso por zero (ArithmeticException)
Uso de um ndice invlido em arranjo (ArrayIndexOutOfBoundsException)
Acesso a uma referncia nula (NullPointerException)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 335 / 549
POO Exceo
Tratamento de Exceo Exemplo 03
public int divide( int a, int b ) {
2 try {
return a / b;
4 } catch (ArithmeticException e) {
e.printStackTrace();
6 return 0;
}
8 }
Pergunta-se
O que acontece se a exceo for ativada? E se no for?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 336 / 549
POO Exceo
Tratamento de Exceo Exemplo 04
public int divide( int a, int b ) {
2 try {
return a / b;
4 } catch (ArithmeticException e) {
System.out.println("Problema na divisao: " + e.getMessage());
6 return 0;
} finally {
8 System.out.printf("encerrando divisao(%d,%d)", a, b);
}
10 }
Pergunta-se
O que acontece se a exceo for ativada? E se no for?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 337 / 549
POO Exceo
Tratamento de Exceo Exemplo 05
public int divide( int a, int b ) {
2 try {
return a / b;
4 } finally {
System.out.printf("encerrando divisao(%d,%d)", a, b);
6 }
}
Pergunta-se
O que acontece se alguma exceo for ativada? E se no for?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 338 / 549
POO Exceo
Tratamento de Exceo Exemplo 06 Situao Real
1 public void lerArquivo( String fileName ) {
try {
3 Reader in = new FileReader( fileName );
LineNumberReader reader = new LineNumberReader( in );
5 while ( reader.ready() ) {
System.out.println( reader.getLineNumber() + ": " + reader.readLine() );
7 }
reader.close();
9 in.close();
} catch (FileNotFoundException e) {
11 System.out.println( "Arq. nao existe. Causa: " + e.getMessage() );
} catch (IOException e) {
13 System.out.println( "Erro de E/S. Causa: " + e.getMessage() );
} catch (Throwable e){
15 System.out.println( "Erro de Inesperado. Causa: " + e.getMessage() );
}
17 }
Pergunta-se
1
O que ocorre se uma RuntimeException for ativada?
2
Pode inverter a ordem das excees?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 339 / 549
Se no encontrar o
arquivo
Algum erro na leitura do
arquivo
Qualquer outro erro
POO Exceo
Tratamento de Exceo Exemplo 06 Situao Real
Explicao
A ordem das excees deve ser da mais especca para a
mais genrica
Por exemplo, se Throwable estivesse no 1
o
bloco catch,
qualquer exceo entraria nesse bloco
Porque, na verdade, vericado se a exceo subclasse
da exceo discriminada no catch
E, como sabemos, todas as excees so subclasses de
Throwable
Como FileNotFoundException uma IOException,
tambm no poderia mudar. Logo, nesse exemplo no se
pode alterar a ordem do tratamento de excees
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 340 / 549
POO Exceo
Propagao de Exceo
throws
Permite ao mtodo chamado delegar o tratamento do erro
para o mtodo chamador
Metfora com chefe mandando funcionrio fazer algo e
algum problema aparece para o funcionrio
uma boa prtica de programao, pois permite construir
sistemas onde tratamento de erros centralizado
Propagao de Exceo Sintaxe
Basta colocar no throws no nal da assinatura do mtodo
Por exemplo:
public int f() throws E1
private void g( double d ) throws E1, E2
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 341 / 549
POO Exceo
Propagao de Exceo Exemplo 01
1 public static Date stringToDate( String sd ) {
DateFormat dateFormat = new SimpleDateFormat( "dd/MM/yyyy" );
3 dateFormat.setLenient( false );
try {
5 return dateFormat.parse( sd );
} catch (ParseException e) {
7 return new Date(); /
*
caso erro, retorne "agora"
*
/
}
9 }
Think about...
Exceo ativada caso o string da data seja invlido
Logo, todas as invocaes a esse mtodo com um string
invlido ter a data atual como seu retorno
Mas, se quisssemos deixar essa deciso para quem
chamou?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 342 / 549
POO Exceo
Propagao de Exceo Exemplo 01 Soluo
public static Date stringToDate( String sd ) throws ParseException {
2 DateFormat dateFormat = new SimpleDateFormat( "dd/MM/yyyy" );
dateFormat.setLenient( false );
4 return dateFormat.parse( sd );
}
Ento a soluo caso a exceo seja ativada
progag-la ao mtodo chamador e no trat-la
Observe que no mais a trata, mas sim, delega!
Desse modo, cada chamada a esse mtodo ter seu
prprio tratamento, pois assim foi delegado a ele
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 343 / 549
POO Exceo
Propagao de Exceo Exemplo 01 Completo
1 public static void main( String[] args ) {
String sd = Teclado.lerString( "Digite seu aniversario" );
3 try {
Date d = stringToDate( sd );
5 System.out.printf( "Voce tem %d anos",
(System.currentTimeMillis() - d.getTime()) /31536000000L);
7 } catch (ParseException e) {
System.out.println( "Data invalida. Tente novamente." );
9 }
}
11
public static Date stringToDate( String sd ) throws ParseException {
13 DateFormat dateFormat = new SimpleDateFormat( "dd/MM/yyyy" );
dateFormat.setLenient( false );
15 return dateFormat.parse( sd );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 344 / 549
POO Exceo
Propagao de Exceo Exemplo 02a
public static void main( String args[] ) {
try {
a(); b(); c(); d();
} catch (E1 e) {
e(); f();
} catch (E2 e) {
g(); h();
}
m(); n();
}
public static void b() throws E1 {
x(); y(); z();
}
Pergunta-se: Quais mtodos sero executados caso ative...
1
exceo E1 no mtodo y?
2
exceo E2 no mtodo z?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 345 / 549
POO Exceo
Propagao de Exceo Exemplo 02b
public static void main( String args[] ) {
try {
a(); b(); c(); d();
} catch (E1 e) {
e(); f();
} catch (E2 e) {
g(); h();
}
m(); n();
}
public static void b() throws E1 {
x(); y(); z();
}
Pergunta-se
Quais mtodos sero executados caso uma RuntimeException
seja ativada no mtodo x?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 346 / 549
POO Exceo
Propagao de Exceo Exemplo 03
public static void main( String args[] ) throws E3 {
try {
a(); b(); c(); d();
} catch (E1 e) {
e(); f();
}
m(); n();
}
public static void b() throws E1, E3 {
x(); y();
try {
z();
} catch (E2 e) {
g(); h();
}
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 347 / 549
Pergunta-se: Quais mtodos
sero executados caso ative...
exceo E3 no mtodo y?
exceo E2 no mtodo z?
POO Exceo
Verdades cruis
E se propagarmos todas as excees em todos os
mtodos?
Nesse caso, a exceo vai chegar para a JVM tratar
No creio que seja uma boa ideia (ela derruba a aplicao)
Porque que no precisa tratar excees do tipo
RuntimeException?
Simplesmente porque implicitamente todos os mtodos j
propagam excees deste tipo
Por exemplo, a declarao dos dois mtodos abaixo
idntica:
private void f()
private void f() throws RuntimeException
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 348 / 549
POO Exceo
Criao de Exceo
Uma exceo nada mais que uma classe que estende
java.lang.Exception
normalmente sobrescreve o mtodo getMessage
Logo, voc pode criar sua prpria classe de exceo com
atributos, mtodos, construtores como uma classe normal
Quando voc cria uma exceo, o mtodo que poder
ativ-la deve propagar tal exceo
Ativando Excees
Basta colocar throw antes do objeto de exceo a ser
ativado
Por exemplo:
throw new E1( x, y );
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 349 / 549
POO Exceo
Criao de Exceo Exemplo Ilustrativo
Para ilustrar a criao de uma exceo, ser alterado o
mtodo retirar da classe Conta
Esse mtodo no mais retornar boolean, mas sim void
E, caso o saldo seja insuciente, ser ativada uma exceo
do tipo SemSaldoException
Passos
1
Criar a exceo SemSaldoException
2
Alterar o mtodo retirar
3
Ajustar o sistema devido a nova forma de uso do mtodo
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 350 / 549
POO Exceo
Criao de Exceo Exemplo Ilustrativo Passo 1
public class SemSaldoException extends Exception {
2 private double saldo;
private double valor;
4
public SemSaldoException(double saldo, double valor) {
6 this.saldo = saldo;
this.valor = valor;
8 }
10 @Override
public String getMessage() {
12 return "Nao foi possivel retirar R$" + this.valor
+ ", pois o saldo e de R$" + this.saldo
14 + ". Em outras palavras, faltou R$" + (valor - saldo);
}
16 }
Importante
Estende Exception e no Throwable, por que?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 351 / 549
POO Exceo
Criao de Exceo Exemplo Ilustrativo Passo 2
public class Conta {
2 ...
public void retirar( double valor ) throws SemSaldoException {
4 if ( valor <= this.saldo ) {
this.saldo -= valor;
6 } else {
throw new SemSaldoException( this.saldo, valor );
8 }
}
10 ...
}
Observaes
O mtodo retirar agora propaga (throws) a exceo!
Em uma situao especca, o mtodo ativa (throw) a
exceo!
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 352 / 549
POO Exceo
Criao de Exceo Exemplo Ilustrativo Passo 3
public static void main( String[] args ) {
2 Conta c = new Conta( new Correntista( 111, "Fred" ), 25.0 );
...
4 try {
c.retirar( 20 );
6 } catch (SemSaldoException e) {
System.out.println( e.getMessage() );
8 }
10 try {
c.retirar( 10 );
12 } catch (SemSaldoException e) {
System.out.println( e.getMessage() );
14 }
...
16 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 353 / 549
OK!
Exceo Ativada!
Nao foi possivel retirar R$10.0, pois o saldo e de R$5.0.
Em outras palavras, faltou R$5.0
POO Exceo
Para concluir esta seo
Eu entendi que excees do tipo RuntimeException no
precisam ser tratadas e entendi tambm o throws implcito,
mas porque Java no quer que tratemos tais excees?
Simplesmente, porque so muito fceis de evitar. Em outras
palavras, se ocorrer com regularidade tais excees em
seu sistema, voc um pssimo programador
Nos prximos slides veremos algumas excees no
vericveis e boas prticas para evit-las
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 354 / 549
POO Exceo
ArithmeticException NUNCA!
...
try {
c = a / b;
} catch (ArithmeticException e) {
...
}
...
ArithmeticException SEMPRE!
...
if ( b != 0 ) {
c = a / b;
}
...
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 355 / 549
POO Exceo
NullPointerException NUNCA!
...
for ( Conta c : contas ) {
try {
System.out.println(c.getNumero());
} catch (NullPointerException e) {
...
}
}
...
NullPointerException SEMPRE!
...
for ( Conta c : contas ) {
if ( c != null ) {
System.out.println(c.getNumero());
}
}
...
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 356 / 549
POO Exceo
ArrayIndexOutOfBoundsException NUNCA!
...
try {
v[i] = 50;
} catch (ArrayIndexOutOfBoundsException e) {
...
}
...
ArrayIndexOutOfBoundsException SEMPRE!
...
if ( i < v.length ) {
v[i] = 50;
}
...
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 357 / 549
POO Exceo
Sntese da Seo
try: bloco protegido
catch: executado se ocorre uma exceo do tipo indicado
finally: sempre executado
throws: na assinatura do mtodo, indicando que ele
propaga tal exceo
throw: ativa uma exceo
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 358 / 549
5. Padres de Projeto Contedo
1
Introduo 3
2
UML 22
3
Java 62
4
POO 186
5
Padres de Projeto 359
Singleton 361
Decorator 364
Abstract Factory 377
6
Tpicos Relevantes 389
7
Materiais Complementares 420
8
Extras 510
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 359 / 549
Padres de Projeto
Padro de Projeto
uma soluo para um problema recorrente no
desenvolvimento de sistemas. Consiste em uma descrio
ou modelo de como resolver um problema. Normalmente,
mostra relacionamentos e interaes entre classes e objetos
Exemplo: Singleton, Decorator, Abstract Factory etc
Nessa disciplina, veremos alguns mais utilizados e relevantes
disciplina
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 360 / 549
Padres de Projeto
Singleton
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 361 / 549
Padres de Projeto Singleton
Singleton
um padro de criao que faz com que uma classe
tenha uma nica instncia
Para isso:
Construtor privado
Assim, somente a prpria classe pode criar seus objetos
Um atributo privado e esttico chamado instance do tipo
da classe
Mtodo sincronizado e esttico chamado getInstance que
retorna a nica instncia
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 362 / 549
Padres de Projeto Singleton
Singleton Exemplo
1 public class Singleton {
private static Singleton instance = null;
3
private Singleton() {
5 }
7 public synchronized static Singleton getInstance() {
if ( instance == null ) {
9 instance = new Singleton();
}
11 return instance;
}
13 }
Assim...
Para obter o objeto da classe, basta:
Singleton s = Singleton.getInstance();
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 363 / 549
Padres de Projeto
Decorator
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 364 / 549
Padres de Projeto Decorator
Decorator
um padro estrutural que permite dinamicamente
agregar responsabilidades adicionais a um objeto
uma alternativa exvel ao uso de subclasses para
extenso de funcionalidades
Largamente utilizado na API de manipulao de arquivos
em Java (veja p. 1)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 365 / 549
Padres de Projeto Decorator
Estrutura
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 366 / 549
Padres de Projeto Decorator
Exemplo
Suponha que voc tenha um texto a ser renderizado e que
algumas voc voc deseja que:
seja exibido normalmente
seja exibido em negrito
seja exibido com um link
seja exibido em negrito como um link
Esse nosso problema exemplo e a soluo uso do
padro Decorator
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 367 / 549
Padres de Projeto Decorator
Exemplo Diagrama de Classes
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 368 / 549
Padres de Projeto Decorator
Exemplo Interface Text
1 public interface Text {
public String getRenderization(); /
*
obtem o codigo HTML
*
/
3 }
Exemplo Implementao Simples PlainText
public class PlainText implements Text {
2 private String text;
4 public PlainText(String text) {
this.text = text;
6 }
8 @Override
public String getRenderization() {
10 return this.text;
}
12 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 369 / 549
Padres de Projeto Decorator
Exemplo Decorator Abstrato TextDecorator
1 public abstract class TextDecorator implements Text {
protected Text decoratedText; /
*
texto a decorar
*
/
3
public TextDecorator(Text decoratedText) {
5 this.decoratedText = decoratedText;
}
7
@Override
9 public String getRenderization() {
return decoratedText.getRenderization();
11 }
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 370 / 549
Padres de Projeto Decorator
Exemplo Decorator Concreto BoldTextDecorator
public class BoldTextDecorator extends TextDecorator {
2
public BoldTextDecorator(Text decoratedText) {
4 super( decoratedText );
}
6
@Override
8 public String getRenderization() {
return "<b>" + decoratedText.getRenderization() + "</b>";
10 }
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 371 / 549
Padres de Projeto Decorator
Exemplo Decorator Concreto LinkTextDecorator
public class LinkTextDecorator extends TextDecorator {
2 private String link;
4 public LinkTextDecorator(Text decoratedText, String link) {
super( decoratedText );
6 this.link = link;
}
8
@Override
10 public String getRenderization() {
return "<a href=\"" + this.link + "\">"
12 + decoratedText.getRenderization() + "</a>";
}
14 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 372 / 549
Padres de Projeto Decorator
Exemplo Uso 1 (simples)
public static void main( String[] args ) {
Text texto = new PlainText( "Ricardo Terra" );
System.out.println( texto.getRenderization() );
}
Sada
Ricardo Terra
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 373 / 549
Padres de Projeto Decorator
Exemplo Uso 2 (negrito)
public static void main( String[] args ) {
Text texto = new BoldTextDecorator(
new PlainText( "Ricardo Terra" ) );
System.out.println( texto.getRenderization() );
}
Sada
<b>Ricardo Terra</b>
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 374 / 549
Padres de Projeto Decorator
Exemplo Uso 3 (link)
public static void main( String[] args ) {
Text texto = new LinkTextDecorator(
new PlainText( "Ricardo Terra" ),
"http://www.ricardoterra.com.br" );
System.out.println( texto.getRenderization() );
}
Sada
<a href="http://www.ricardoterra.com.br">Ricardo
Terra</a>
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 375 / 549
Padres de Projeto Decorator
Exemplo Uso 4 (link em negrito)
public static void main( String[] args ) {
Text texto = new LinkTextDecorator(
new PlainText( "Ricardo Terra" ),
"http://www.ricardoterra.com.br" );
System.out.println( texto.getRenderization() );
}
Sada
<a href="http://www.ricardoterra.com.br"><b>Ricardo
Terra</b></a>
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 376 / 549
Padres de Projeto
Abstract Factory
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 377 / 549
Padres de Projeto Abstract Factory
Abstract Factory
um padro de criao que fornece uma forma de
criao de famlia de objetos relacionados ou
dependentes sem especicar suas classes concretas
Assim, os clientes no se acoplam s implementaes
(classes concretas), mas sim, apenas s interfaces
Isso vai a favor do princpio de programao conhecido
como Programao por Interface
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 378 / 549
Padres de Projeto Abstract Factory
Estrutura
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 379 / 549
Padres de Projeto Abstract Factory
Estrutura Explicao Bsica
Na necessidade de um Button, a aplicao busca a
respectiva fbrica
Assim, retornada um WinFactory ou um OSXFactory
A aplicao no sabe qual fbrica foi retornada, mas,
independente de qual fbrica, ela capaz de criar Button
Devido ao contrato estabelecido pela interface
E assim criar e manipular botes como Button, isto ,
sem saber qual classe concreta realmente est
manipulando
Mais uma vez: Programao por Interfaces
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 380 / 549
Padres de Projeto Abstract Factory
Exemplo
Suponha que voc tenha um sistema que
automaticamente antes das 12h a interface do sistema seja
grca e, aps esse horrio, a interface seja textual
Esse nosso problema exemplo e a soluo uso do
padro Abstract Factory
Isto , teremos duas fbricas: textual e grca
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 381 / 549
Padres de Projeto Abstract Factory
Exemplo Diagrama de Classes
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 382 / 549
Padres de Projeto Abstract Factory
Exemplo Interface Input (alunos devem fazer)
public interface Input {
2 String ler();
}
Exemplo Interface Output
1 public interface Output {
void escrever( String s );
3 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 383 / 549
Padres de Projeto Abstract Factory
Exemplo Implementao Sada Textual TextualOutput
1 public class TextualOutput implements Output {
3 @Override
public void escrever( String s ) {
5 System.out.print( s );
}
7 }
Exemplo Implementao Sada Grca GraphicalOutput
1 public class GraphicalOutput implements Output {
3 @Override
public void escrever( String s ) {
5 JOptionPane.showMessageDialog( null, s );
}
7 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 384 / 549
Padres de Projeto Abstract Factory
Exemplo Fbrica Abstrata IOFactory
1 public abstract class IOFactory {
3 public final static IOFactory getIOFactory() {
if (Calendar.getInstance().get(Calendar.HOUR_OF_DAY) >= 11) {
5 return new TextualFactory();
}else{
7 return new GraphicalFactory();
}
9 }
11 public abstract Input getInput();
13 public abstract Output getOutput();
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 385 / 549
Padres de Projeto Abstract Factory
Exemplo Fbrica Concreta TextualFactory
public class TextualFactory extends IOFactory {
2
@Override
4 public Input getInput() {
return new TextualInput();
6 }
8 @Override
public Output getOutput() {
10 return new TextualOutput();
}
12
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 386 / 549
Padres de Projeto Abstract Factory
Exemplo Fbrica Concreta GraphicalFactory
1 public class GraphicalFactory extends IOFactory {
3 @Override
public Input getInput() {
5 return new GraphicalInput();
}
7
@Override
9 public Output getOutput() {
return new GraphicalOutput();
11 }
13 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 387 / 549
Padres de Projeto Abstract Factory
Exemplo Uso
public static void main( String[] args ) {
Output out = IOFactory.getIOFactory().getOutput();
out.escrever( "Abstract Factory por Ricardo Terra" );
}
Sada
11:10 12:20
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 388 / 549
6. Tpicos Relevantes Contedo
1
Introduo 3
2
UML 22
3
Java 62
4
POO 186
5
Padres de Projeto 359
6
Tpicos Relevantes 389
Streams 390
7
Materiais Complementares 420
8
Extras 510
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 389 / 549
Tpicos Relevantes
Streams
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 390 / 549
Tpicos Relevantes Streams
Objetivos desta seo
Manipulao de arquivos texto e binrio
Serializao de objetos Java
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 391 / 549
Tpicos Relevantes Streams
Classe java.io.File
Classe responsvel em realizar mtodos em arquivos fsicos.
Para se construir um objeto do tipo File, deve saber o
nome completo do arquivo. Caso o arquivo esteja na raiz
do workspace do Eclipse pode apenas passar o nome do
arquivo
Caso se passe o nome de um arquivo que no existe, este
criado na primeira necessidade
Exemplo:
new File("C:\\pasta\\meuArquivo.txt")
new File("meuArquivoNoWorkspace.txt")
new File("/dev/etc/xpto.txt")
new File("/bin")
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 392 / 549
Tpicos Relevantes Streams
Alguns mtodos relevantes
boolean canRead() /
*
Permisso de Leitura?
*
/
2
boolean canWrite() /
*
Permisso de Escrita?
*
/
4
/
*
Reconhece o tipo do arquivo
*
/
6 boolean isFile()
boolean isDirectory()
8
renameTo() /
*
Renomeia o arquivo/diretrio
*
/
10
mkdir() /
*
Cria diretrio
*
/
12
String[] list() /
*
Lista o contedo do diretrio
*
/
14
File[] listFiles() /
*
Lista todos os arquivos do diretrio
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 393 / 549
Tpicos Relevantes Streams
Exemplo java.io.File Arquivo
1 File fileTexto = new File( "arquivoTexto.txt" );
System.out.println( "Nome do arquivo: " + fileTexto.getName() );
3 System.out.println( "O arquivo existe? " + fileTexto.exists() );
System.out.println( "E um diretorio? " + fileTexto.isDirectory() );
5 if ( fileTexto.isFile() ) {
System.out.println( "E um arquivo do diretorio: "
7 + fileTexto.getAbsolutePath() );
}
9 System.out.println( "Posso ler? " + fileTexto.canRead() );
System.out.println( "Posso escrever? " + fileTexto.canWrite() );
11 System.out.println( "Renomeou com sucesso? "
+ fileTexto.renameTo( new File( "renomeado.txt" ) ) );
Nome do arquivo: arquivoTexto.txt
O arquivo existe? true
um diretrio? false
um arquivo do diretrio: /Terra/apostilaJava/arquivoTexto.txt
Posso ler? true
Posso escrever? false
Renomeou com sucesso? true
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 394 / 549
Tpicos Relevantes Streams
Exemplo java.io.File Diretrio
1 File fileDiretorio = new File( "streams" );
System.out.println( "Nome do arquivo: " + fileDiretorio.getName() );
3 System.out.println( "E um diretorio? " + fileDiretorio.isDirectory() );
5 File[] files = fileDiretorio.listFiles();
System.out.println( "Conteudo do diretorio:" );
7 for (File f : files){
System.out.println("\t" + f.getName());
9 }
Nome do arquivo: streams
um diretrio? true
Contedo do diretrio:
ExemploDiretorio.class
ExemploDiretorio.java
ExemploFile.class
ExemploFile.java
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 395 / 549
Tpicos Relevantes Streams
Tipos principais de streams
Texto
Binrio
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 396 / 549
Tpicos Relevantes Streams
Reader
Suas subclasses efetuam leitura textual
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 397 / 549
Tpicos Relevantes Streams
Exemplo Reader
1 try {
File file = new File( "arquivoTexto.txt" );
3 Reader in = new FileReader( file );
LineNumberReader reader = new LineNumberReader( in );
5 while ( reader.ready() ) {
System.out.print( reader.getLineNumber() + ": " );
7 System.out.println( reader.readLine() );
}
9 reader.close();
in.close();
11 } catch (FileNotFoundException e) {
System.out.println( "Arq. nao existe. Causa: " + e.getMessage() );
13 } catch (IOException e) {
System.out.println( "Erro de E/S. Causa: " + e.getMessage() );
15 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 398 / 549
Tpicos Relevantes Streams
Writer
Suas subclasses efetuam escrita textual
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 399 / 549
Tpicos Relevantes Streams
Exemplo Writer
1 try {
File file = new File( "arquivoGravado.txt" );
3 FileWriter out = new FileWriter( file );
out.write( "Linguagem Java\n" );
5
PrintWriter writer = new PrintWriter( out );
7 writer.println( "Aprendendo Streams" );
writer.println( "Professor Ricardo Terra" );
9
writer.close();
11 out.close();
} catch (IOException e) {
13 System.out.println( "Erro de E/S. Causa: " + e.getMessage() );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 400 / 549
Tpicos Relevantes Streams
Um exemplo com Reader
A maioria das vezes quando lemos um arquivo em disco
porque queremos extrair informaes dele para serem
utilizadas pelo aplicativo
Vamos, por exemplo, considerar um arquivo texto em que:
na 1
a
linha existe nmeros separados por tabulao (\t)
2 4 6 8 10
O programa dever ler esses nmeros, guardar em um
arranjo e depois imprimir a soma deles
No prximo slide demonstra como deve ser feito
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 401 / 549
Tpicos Relevantes Streams
Exemplo Completo Reader
1 try {
File file = new File( "entrada.txt" );
3 Reader in = new FileReader( file );
LineNumberReader reader = new LineNumberReader( in );
5
if ( reader.ready() ) {
7 String[] numeros = reader.readLine().split( "\t" );
int[] array = new int[numeros.length];
9 for ( int i = 0; i < numeros.length; i++ ) {
array[i] = Integer.parseInt( numeros[i] );
11 }
int soma = 0;
13 for ( int numero : array ) {
soma += numero;
15 }
System.out.println( "Soma: " + soma );
17 }
19 reader.close();
in.close();
21 } catch ...
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 402 / 549
Tpicos Relevantes Streams
InputStream
Suas subclasses efetuam leitura binria
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 403 / 549
Tpicos Relevantes Streams
Exemplo InputStream
try {
2 final String zeros = "00000000";
File file = new File( "star.gif" );
4 InputStream in = new FileInputStream( file );
int i = 0;
6 while ( (i = in.read()) != -1 ) {
String str = Integer.toBinaryString( i );
8 System.out.print( zeros.substring( str.length() ) + str );
}
10 in.close();
} catch (FileNotFoundException e) {
12 System.out.println( "Arq. nao existe. Causa: " + e.getMessage() );
} catch (IOException e) {
14 System.out.println( "Erro de E/S. Causa: " + e.getMessage() );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 404 / 549
Tpicos Relevantes Streams
OutputStream
Suas subclasses efetuam escrita binria
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 405 / 549
Tpicos Relevantes Streams
Exemplo OutputStream
try {
2 File file = new File( "arquivoGravado.bin" );
/
*
Se for passado true, o arquivo sera concatenado
*
/
4 OutputStream out = new FileOutputStream( file, false );
out.write( 65 );
6 out.write( 66 );
out.write( 67 );
8 out.close();
} catch (IOException e) {
10 System.out.println( "Erro de E/S. Causa: " + e.getMessage() );
}
O que foi gravado?
01000001 01000010 01000011
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 406 / 549
Tpicos Relevantes Streams
Lendo e escrevendo objetos ObjectStream
possvel escrever dados binrios em um arquivo e depois
l-los
Para isso, utilizamos as classes ObjectInputStream e
ObjectOutputStream
Para um objeto ser gravado em um arquivo, ele dever
implementar java.io.Serializable
Essa interface no tem nenhum mtodo. s para que Java
saiba que essa classe ser persistida
Os tipos primitivos podem ser gravados tambm sem
problema algum
Vejamos alguns exemplos nos prximos slides
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 407 / 549
Tpicos Relevantes Streams
Exemplo ObjectOutputStream
try {
2 File file = new File( "dados.bin" );
ObjectOutput out = new ObjectOutputStream(
4 new FileOutputStream( file ) );
6 out.writeInt( 65 );
out.writeDouble( 66.9 );
8 out.writeChar( C );
10 out.close();
} catch (FileNotFoundException e) {
12 System.out.println( "Arq. nao existe. Causa: " + e.getMessage() );
} catch (IOException e) {
14 System.out.println( "Erro de E/S. Causa: " + e.getMessage() );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 408 / 549
Tpicos Relevantes Streams
Exemplo ObjectInputStream
1 try {
File file = new File( "dados.bin" );
3 ObjectInput in = new ObjectInputStream(
new FileInputStream( file ) );
5
int i = in.readInt();
7 double d = in.readDouble();
char c = in.readChar();
9
/
*
11
*
Se fosse a leitura fosse em ordem diferente,
*
os resultados seriam diferentes
13
*
/
System.out.printf( "%d %.2f %c", i, d, c );
15
in.close();
17 } catch (FileNotFoundException e) {
System.out.println( "Arq. nao existe. Causa: " + e.getMessage() );
19 } catch (IOException e) {
System.out.println( "Erro de E/S. Causa: " + e.getMessage() );
21 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 409 / 549
Tpicos Relevantes Streams
Lendo e escrevendo objetos ObjectStream
Mas, o interessante gravarmos um objeto de uma classe
(que deve estender java.io.Serializable) e funciona
do mesmo modo s que utilizar o mtodo writeObject e
readObject
Alm disso, perceber que teremos que tratar mais uma
exceo que possa vir a ocorrer:
ClassNotFoundException
Pois, quando voc ler o objeto de um arquivo, a classe desse
objeto pode no existir no seu projeto
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 410 / 549
Tpicos Relevantes Streams
Suponha a classe Aluno
1 public class Aluno implements Serializable {
private int matricula;
3 private String nome;
private Date dataNascimento;
5
public Aluno(int matricula, String nome, Date dataNascimento) {
7 super();
this.matricula = matricula;
9 this.nome = nome;
this.dataNascimento = dataNascimento;
11 }
13 @Override
public String toString() {
15 return this.matricula + " - " + this.nome + " - "
+ Conversor.dateToString(
17 this.dataNascimento, "dd/MM/yyyy" );
}
19
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 411 / 549
Tpicos Relevantes Streams
Exemplo ObjectOutputStream com Aluno
1 try {
File file = new File( "aluno.bin" );
3 ObjectOutput out = new ObjectOutputStream(
new FileOutputStream( file ) );
5
Aluno a = new Aluno( 1, "Carlos Eduardo da Silva", new Date( 0 ) );
7 out.writeObject( a );
9 out.close();
} catch (FileNotFoundException e) {
11 System.out.println( "Arq. nao existe. Causa: " + e.getMessage() );
} catch (IOException e) {
13 System.out.println( "Erro de E/S. Causa: " + e.getMessage() );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 412 / 549
Tpicos Relevantes Streams
Exemplo ObjectInputStream com Aluno
1 try {
File file = new File( "aluno.bin" );
3 ObjectInput in = new ObjectInputStream(
new FileInputStream( file ) );
5
Aluno a = (Aluno) in.readObject();
7 System.out.println( a );
9 in.close();
} catch (ClassNotFoundException e) {
11 System.out.println( "Classe nao existe. Causa: " + e.getMessage() );
} catch (FileNotFoundException e) {
13 System.out.println( "Arq. nao existe. Causa: " + e.getMessage() );
} catch (IOException e) {
15 System.out.println( "Erro de E/S. Causa: " + e.getMessage() );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 413 / 549
Tpicos Relevantes Streams
Lendo e escrevendo objetos ObjectStream
O exemplo anterior pode at ser interessante, mas um
aluno por arquivo no a melhor soluo
Solues:
Voc poderia inserir vrios alunos e depois ir lendo at o nal
do arquivo
ou
Gravar uma coleo de alunos no arquivo
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 414 / 549
Tpicos Relevantes Streams
Exemplo ObjectOutputStream com vrios objetos Aluno
try {
2 File file = new File( "alunos.bin" );
FileOutputStream out = new FileOutputStream( file );
4 ObjectOutput objectOut = new ObjectOutputStream( out );
6 objectOut.writeObject( new Aluno( 1, "Carlos", new Date( 0 ) ) );
objectOut.writeObject( new Aluno( 2, "Maria", new Date( 0 ) ) );
8 objectOut.writeObject( new Aluno( 3, "Roberto", new Date( 0 ) ) );
10 objectOut.close();
out.close();
12 } catch (IOException e) {
System.out.println( "Erro de E/S. Causa: " + e.getMessage() );
14 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 415 / 549
Tpicos Relevantes Streams
Exemplo ObjectInputStream com vrios objetos Aluno
try {
2 File file = new File( "alunos.bin" );
FileInputStream in = new FileInputStream( file );
4 ObjectInput objectIn = new ObjectInputStream( in );
6 while ( objectIn.available() > 0 ) {
Aluno a = (Aluno) objectIn.readObject();
8 System.out.println( a );
}
10
objectIn.close();
12 in.close();
} catch (ClassNotFoundException e) {
14 System.out.println( "Classe nao existe. " + e.getMessage() );
} catch (FileNotFoundException e) {
16 System.out.println( "Arq. nao existe. " + e.getMessage() );
} catch (IOException e) {
18 System.out.println( "Erro de E/S. Causa: " + e.getMessage() );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 416 / 549
Tpicos Relevantes Streams
Exemplo ObjectOutputStream com coleo de objetos Aluno
1 try {
File file = new File( "aluno.bin" );
3 ObjectOutput out = new ObjectOutputStream(
new FileOutputStream( file ) );
5
List<Aluno> alunos = new ArrayList<Aluno>();
7 alunos.add( new Aluno( 1, "Carlos Eduardo", new Date( 0 ) ) );
alunos.add( new Aluno( 2, "Maria Aparecida", new Date() ) );
9 alunos.add( new Aluno( 3, "Roberto Carlos", new Date( 0 ) ) );
out.writeObject( alunos );
11
out.close();
13 } catch (FileNotFoundException e) {
System.out.println( "Arq. nao existe. Causa: " + e.getMessage() );
15 } catch (IOException e) {
System.out.println( "Erro de E/S. Causa: " + e.getMessage() );
17 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 417 / 549
Tpicos Relevantes Streams
Exemplo ObjectInputStream com coleo de objetos Aluno
try {
2 File file = new File( "aluno.bin" );
ObjectInput in = new ObjectInputStream(
4 new FileInputStream( file ) );
6 List<Aluno> alunos = (List<Aluno>) in.readObject();
for ( Aluno a : alunos ) {
8 System.out.println( a );
}
10
in.close();
12 } catch (ClassNotFoundException e) {
System.out.println( "Classe nao existe. Causa: " + e.getMessage() );
14 } catch (FileNotFoundException e) {
System.out.println( "Arq. nao existe. Causa: " + e.getMessage() );
16 } catch (IOException e) {
System.out.println( "Erro de E/S. Causa: " + e.getMessage() );
18 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 418 / 549
Tpicos Relevantes Streams
Lendo e escrevendo objetos ObjectStream
1
Copiar um arquivo texto para um outro arquivo utilizando
FileReader e FileWriter
2
Copiar uma arquivo binrio (imagem, por exemplo) para
um outro arquivo utilizando InputStream e OutputStream
3
Ler um arquivo texto utilizando LineNumberReader e depois
grav-lo ao inverso utilizando PrintWriter
Por exemplo, arquivo origem est escrito ABCDE, o de
destino estar escrito EDCBA
Dica: Utilize o mtodo reverse de um objeto da classe
StringBuilder
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 419 / 549
7. Materiais Complementares Contedo
1
Introduo 3
2
UML 22
3
Java 62
4
POO 186
5
Padres de Projeto 359
6
Tpicos Relevantes 389
7
Materiais Complementares 420
Classes Wrapper 421
Classe Math 430
Classe String 443
Classe Date 462
Classe StringBuilder e StringBuffer 468
Classe StringTokenizer 477
Classe Iterator 481
Colees 487
Usando import static 503
8
Extras 510
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 420 / 549
Materiais Complementares
Classes Wrapper
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 421 / 549
Materiais Complementares Classes Wrapper
Para cada tipo primitivo de Java existe uma classe
correspondente que basicamente armazena o tipo
primitivo e prov diversas operaes comuns, por exemplo:
converter um string para o tipo em questo
obter sua representao binria
Essa classe denominada classe Wrapper
com esse recurso, um arranjo de objetos pode conter tipos
primitivos
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 422 / 549
Materiais Complementares Classes Wrapper
Tipo Primitivo Classe Wrapper
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
Resumo:
Exatamente o nome do tipo primitivo iniciando com caixa
alta, exceto: Character e Integer
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 423 / 549
Materiais Complementares Classes Wrapper
Convertendo um tipo primitivo para um objeto wrapper
Toda classe wrapper tem um construtor a partir de seu tipo
primitivo e de um string (exceto Character)
Exemplo:
Integer i = new Integer( 231 );
Integer i = new Integer( "231" );
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 424 / 549
Materiais Complementares Classes Wrapper
Convertendo um string para um tipo primitivo
Uma outra utilidade de uma classe wrapper a de
converter um string para um tipo primitivo correspondente
(exceto Character)
Exemplo:
int i = Integer.parseInt( "231" );
double d = Double.parseDouble( "231e-2" );
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 425 / 549
Materiais Complementares Classes Wrapper
Autoboxing e unboxing
A partir do Java 5, a linguagem prov uma forma
automtica de converso de um tipo primitivo para o seu
objeto wrapper e vice-versa
Assim, essa tarefa realizada de forma completamente
transparente, observe:
Integer i = 231;
int j = new Integer( 231 );
int h = i;
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 426 / 549
Materiais Complementares Classes Wrapper Character
Alguns mtodos relevantes
public static boolean isDigit (char ch);
2 public static boolean isLetter (char ch);
public static boolean isLowerCase (char ch);
4 public static boolean isUpperCase (char ch);
public static char toLowerCase (char ch);
6 public static char toUpperCase (char ch);
Exemplo
char ch = a;
System.out.println( Character.isDigit( ch ) ); /
*
false
*
/
System.out.println( Character.isLetter( ch ) ); /
*
true
*
/
if ( Character.isLowerCase( ch ) ) { /
*
true
*
/
ch = Character.toUpperCase( ch );
}
System.out.println( ch );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 427 / 549
Materiais Complementares Classes Wrapper Integer
Alguns mtodos relevantes
1 public static String toBinaryString(int i);
public static String toHexString(int i);
Exemplo
System.out.println( Integer.toBinaryString( i ) ); /
*
11100111
*
/
System.out.println( Integer.toHexString( i ) ); /
*
e7
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 428 / 549
Materiais Complementares Classes Wrapper Double
Alguns mtodos relevantes
public boolean isInfinite();
2 public static boolean isInfinite(double d);
4 public boolean isNaN();
public static boolean isNaN(double d);
Exemplo
double d = 2.0 / 0;
System.out.println( Double.isInfinite( d ) ); /
*
true
*
/
d = 0.0 / 0;
System.out.println( Double.isNaN( d ) ); /
*
true
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 429 / 549
Materiais Complementares
Classe Math
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 430 / 549
Materiais Complementares Classe Math
Classe java.lang.Math
Existe uma classe na prpria API Java que lida com
atribuies matemticas
Essa classe chama-se Math e est no pacote java.lang
importante mencionar que classes no pacote java.lang
no necessitam ser importadas
Math contm diversas operaes e constantes largamente
utilizadas, como exponenciao, raiz quadrada, logaritmo,
seno, coseno, tangente etc
No prximo slide veremos a utilizao de algumas delas
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 431 / 549
Materiais Complementares Classe Math
Mtodo sqrt
Retorna a raiz quadrada de um nmero, i.e.,

n
Assinatura:
public static double sqrt (double n)
Exemplo
double raiz = Math.sqrt( a ); /
*
Suponha a = 4, logo...
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 432 / 549
Materiais Complementares Classe Math
Mtodo pow
Retorna um nmero elevado a outro, i.e., a
b
Assinatura:
public static double pow (double a, double b)
Exemplo
double exp = Math.pow( b, 2 ); /
*
Suponha b = 3, logo...
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 433 / 549
Materiais Complementares Classe Math
Constante PI
Alm de operaes, a classe Math possui uma srie de
constantes, por exemplo, PI
Assinatura:
public static final double PI = 3.141596...
Exemplo
private static double area( double raio ) {
return Math.PI
*
Math.pow( raio, 2 );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 434 / 549
Materiais Complementares Classe Math
Mtodo abs
Retorna o valor absoluto
Assinatura:
public static double abs (double a)
Exemplo
double absoluto = Math.abs( -4.6 );
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 435 / 549
Materiais Complementares Classe Math
Mtodo ceil
Retorna o valor arredondado para cima
Assinatura:
public static double ceil (double a)
Exemplo
double acima = Math.ceil( 4.0001 );
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 436 / 549
Materiais Complementares Classe Math
Mtodo floor
Retorna o valor arredondado para baixo
Assinatura:
public static double oor (double a)
Exemplo
double abaixo = Math.floor( 4.9999 );
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 437 / 549
Materiais Complementares Classe Math
Mtodo max
Retorna o maior valor entre dois nmeros
Assinatura:
public static double max (double a, double b)
Exemplo
double maior = Math.max( a, b );
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 438 / 549
Materiais Complementares Classe Math
Mtodo min
Retorna o menor valor entre dois nmeros
Assinatura:
public static double min (double a, double b)
Exemplo
double menor = Math.min( a, b );
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 439 / 549
Materiais Complementares Classe Math
Mtodo round
Retorna o valor arredondado
Se < x.5 x
Se x.5 x + 1
Assinatura:
public static long round (double a)
Exemplo
long arredondadoParaCima = Math.round( 4.5 );
long arredondadoParaBaixo = Math.round( 4.49999 );
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 440 / 549
Materiais Complementares Classe Math
Mtodo random
Retorna um valor aleatrio n, onde 0.0 n < 1.0
Assinatura:
public static double random ()
Exemplo
double aleatorio = Math.random();
Exemplo Sorteio de um nmero
int num = Teclado.lerInteger( "Digite o numero de concorrentes" );
System.out.printf( "O vencedor foi %d",
(int) Math.ceil( Math.random()
*
num ) );
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 441 / 549
Materiais Complementares Classe Math
Mtodo sin
Retorna o seno do valor passado (em radianos)
Assinatura:
public static double sin (double a)
Exemplo
double seno = Math.sin( Math.PI / 2 ); /
*
1, no caso
*
/
Outros mtodos
Existem tambm:
cos
tan
...
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 442 / 549
Materiais Complementares
Classe String
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 443 / 549
Materiais Complementares Classe String
Em Java, String uma classe
Logo, possui diversos mtodos j implementados que
facilitam a tarefa de programar
Por exemplo, toUpperCase, toLowerCase, charAt etc
Um objeto do tipo String imutvel
Isto , seus mtodos nunca alteram o string, mas sim,
retornam um novo objeto String
Quando voc altera um string, na verdade, um novo
string criado e o coletor de lixo (Garbage Collector ou
GC) ca responsvel por liberar a rea de mmria anterior
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 444 / 549
Materiais Complementares Classe String
Correto, mas no era a inteno
String nome = "Ricardo";
nome.toUpperCase(); /
*
O retorno foi ignorado
*
/
System.out.println( nome ); /
*
Imprimira Ricardo
*
/
Correto
String nome = "Ricardo";
nome = nome.toUpperCase(); /
*
Atribuiu o retorno ao nome
*
/
System.out.println( nome ); /
*
Imprimira RICARDO
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 445 / 549
Materiais Complementares Classe String
Criando um string
Invocando algum construtor da classe String ou utilizando
a notao simplicada
Exemplo
String capital = "Belo Horizonte";
ou
String capital = new String("Belo Horizonte");
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 446 / 549
Materiais Complementares Classe String
Comparando strings
Muitos fazem a comparao de strings utilizando o
operador ==, mas isso completamente errado
A comparao com == com objetos, simplesmente
compara se eles esto na mesma rea de memria
Em Java, a comparao com == entre strings at funciona
devido a um recurso chamado pool de literais, mas ainda
errado!
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 447 / 549
Materiais Complementares Classe String
Pool de literais
Internamente, Java mantm um pool de literais string que
so utilizadas pela aplicao
Quando necessita-se criar um string, o compilador verica
se tal string j existe no pool
Se no existir, cria-se o string e o adiciona no pool
Caso exista, o compilador no cria o string, simplesmente usa
o existente
O uso do pool ajuda a economizar memria e s possvel
devido a imutalidade de objetos da classe String
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 448 / 549
Materiais Complementares Classe String
Errado
String str1 = "Belo Horizonte";
String str2 = "Belo Horizonte";
if ( str1 == str2 ) { /
*
ERRADO. NUNCA FACA ISSO!
*
/
System.out.println( "Strings sao iguais" );
}
Correto
String str1 = "Belo Horizonte";
String str2 = "Belo Horizonte";
if ( str1.equals( str2 ) ) {
System.out.println( "Strings sao iguais" );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 449 / 549
Materiais Complementares Classe String
Comparao
A comparao de strings leva-se em conta a codicao
Unicode. O compilador ao testar se dois strings so iguais,
avaliado caractere por caractere, i.e., se o cdigo Unicode
de ambos coincide. Isso traz algumas implicaes:
A comparao normal (com equals) de strings
case-sensitive:
Brasil = brasil
A comparao de strings accent-sensitive:
Paran = Parana
A comparao de strings diferencia smbolos com adornos
dos sem adornos:
La nia = La nina
Caula = Cacula
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 450 / 549
Materiais Complementares Classe String
Comparao
Como j citado, a comparao normal de strings
realizada por meio do mtodo equals:
Exemplo
String str1 = "Belo Horizonte";
String str2 = "Belo Horizonte";
if ( str1.equals( str2 ) ) {
System.out.println( "Strings sao iguais" );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 451 / 549
Materiais Complementares Classe String
Comparao
Contudo, existe um modo de comparar strings sem
sensibilidade de caixa, i.e., sem diferenciar letras em caixa
alta e caixa baixa por meio do mtodo equalsIgnoreCase
Exemplo
String str1 = "Belo Horizonte";
String str2 = "bElO hOrIzOnTe";
if ( str1.equalsIgnoreCase( str2 ) ) {
System.out.println( "Strings sao iguais" );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 452 / 549
Materiais Complementares Classe String
Comparao
Existem outros mtodos interessantes de comparao de
strings. So eles:
startsWith: Verica se um string inicia com um certo string
endsWith: Verica se um string termina com um certo string
regionMatches: Verica se um substring de um string contm
um substring de um outro string (ideia complexa, mas til)
compareTo: Verica se um string igual, maior ou menor que
outro string
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 453 / 549
Materiais Complementares Classe String
Exemplo
String str = "O rato roeu a roupa do rei de Roma";
System.out.printf("Comeca com \"O\"? %b\n", str.startsWith("O"));
System.out.printf("Termina com \"Roma\"? %b\n",
str.endsWith("Roma"));
/
*
Compara se str da posicao 2 a 5 e igual o string "Jerry, o rato!"
da posicao 9 a 12
*
/
System.out.printf( "Verdade? %b\n",
str.regionMatches( 2, "Jerry, o rato!", 9, 4 ) );
System.out.println("ABC".compareTo("ABC")); /
*
0, sao iguais
*
/
System.out.println("ABC".compareTo("BCD")); /
*
-1, "ABC" e menor
*
/
System.out.println("BCD".compareTo("ABC")); /
*
1, "BCD" e maior
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 454 / 549
Materiais Complementares Classe String
Extrao de partes de um string
Existem dois mtodos comuns para extrair partes de um
string:
substring: Extrai um substring a partir de uma posio com
ou sem limite superior (mtodo sobrecarregado)
charAt: Extrai um caractere em uma determinada posio
(observe que a contagem comea de 0)
Exemplo
String str = "The quick brown fox jumps over the lazy dog";
System.out.println( str.substring( 35 ) ); /
*
"lazy dog"
*
/
System.out.println( str.substring( 4, 9 ) ); /
*
"quick"
*
/
System.out.printf( "%c", str.charAt( 0 ) ); /
*
T
*
/
System.out.printf( "%c", str.charAt( 8 ) ); /
*
k
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 455 / 549
Materiais Complementares Classe String
Tamanho de um string
Basta utilizar o mtodo length
Exemplo
String str = "The quick brown fox jumps over the lazy dog";
System.out.printf( "Tamanho: %d", str.length() ); /
*
43
*
/
/
*
Imprime o string, mas caractere a caractere
*
/
for ( int i = 0; i < str.length(); i++ ) {
System.out.printf( "%c", str.charAt( i ) );
}
/
*
Imprime o inverso do string (caractere a caractere)
*
/
for ( int i = str.length() - 1; i >= 0; i-- ) {
System.out.printf( "%c", str.charAt( i ) );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 456 / 549
Materiais Complementares Classe String
Concatenando strings
Basta utilizar o operador +, mas tambm pode usar o
mtodo concat (desnecessrio)
Exemplo
String firstName = "Ricardo";
String lastName = "Terra";
String name = firstName + " " + lastName;
System.out.println( name ); /
*
Ricardo Terra
*
/
String nameFormatted = lastName.concat( ", " ).concat( firstName );
System.out.println( nameFormatted ); /
*
Terra, Ricardo
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 457 / 549
Materiais Complementares Classe String
Localizando strings
Existem dois mtodos comuns para localizar strings em um
string:
indexOf: Procura a primeira ocorrncia do string e retorna o
ndice que ela comea. Caso no exista, retorna -1
lastIndexOf: Procura a ltima ocorrncia do string e retorna
o ndice que ela comea. Caso no exista, retorna -1
Exemplo
String str = "The quick brown fox jumps over the lazy dog";
System.out.printf( "\"fox\"? %d\n", str.indexOf("fox") ); /
*
16
*
/
System.out.printf( "\"cat\"? %d\n", str.indexOf("cat") ); /
*
-1
*
/
System.out.printf( "\"he\"? %d\n", str.indexOf("he") ); /
*
1
*
/
System.out.printf( "\"he\"? %d\n", str.lastIndexOf("he") ); /
*
32
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 458 / 549
Materiais Complementares Classe String
Formatando strings
Existem trs mtodos comuns para formatar strings:
toLowerCase: Retorna um string toda em caixa baixa
toUpperCase: Retorna um string toda em caixa alta
trim: Retorna um string sem espaos em branco no incio e
no m
Exemplo
String str = " Jose ";
System.out.println( "<" + str.toLowerCase() + ">" ); /
*
< jose >
*
/
System.out.println( "<" + str.toUpperCase() + ">" ); /
*
< JOSE >
*
/
System.out.println( "<" + str.trim() + ">" ); /
*
<Jose>
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 459 / 549
Materiais Complementares Classe String
Um pouco de expresso regular
possvel vericar se um string segue uma expresso regular.
Para isso, deve-se utilizar o mtodo matches
Exemplo
String str = Teclado.lerString( "Carro com F e termina com i" );
if ( str.matches( "F.
*
i" ) ) {
System.out.println( "OK!" );
} else {
System.out.println( "NOK!" );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 460 / 549
Materiais Complementares Classe String
Fragmentando strings
possvel dividir um string pela apario de um caractere
ou de um string. Para isso, deve-se utilizar o mtodo split
Assinatura:
public String[] split ( String separador )
Exemplo
String str = "Carlos,Joao,Maria,Pedro";
String nomes[] = str.split( "," );
for ( String nome : nomes ) {
System.out.println( nome );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 461 / 549
Materiais Complementares
Classe Date
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 462 / 549
Materiais Complementares Classe Date
Armazenando uma data
Em Java, quando deseja-se armazenar uma data,
utilizamos a classe java.util.Date
A classe java.util.Date representa um instante
especco no tempo, com preciso de milisegundos
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 463 / 549
Materiais Complementares Classe Date
Construtores
Um tipo Date pode ser criado:
vazio:
Date d = new Date ();
Isso indica que o objeto d armazena a data exata em que foi
criado
a partir no nmero de milisegundos a partir de 01/01/1970:
Date d1 = new Date ( 450010883000L );
/
*
05/04/1984 08:01:23
*
/
Date d2 = new Date ( -14821304400000L );
/
*
22/04/1500 12:00:00
*
/
Isso indica que o objeto d armazena a data correspondente
a 01/01/1970 + nmero de milisegundos passados
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 464 / 549
Materiais Complementares Classe Date
Alguns mtodos relevantes
1 /
*
Retorna o nmero de milisegundos a partir de 1/1/1970
*
/
public long getTime ( );
3
/
*
Altera o nmero de milisegundos a partir de 1/1/1970
*
/
5 public void setTime ( long time );
7 /
*
Testa se esta data est depois da data especificada
*
/
boolean after ( Date when );
9
/
*
Testa se esta data est antes da data especificada
*
/
11 boolean before ( Date when );
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 465 / 549
Materiais Complementares Classe Date
Exemplo
1 Date d1 = new Date(); /
*
Agora
*
/
3 Date d2 = new Date ( d1.getTime() - 60000 ); /
*
1min antes de agora
*
/
5 d1.setTime( 0L ); /
*
01/01/1970
*
/
7 System.out.println("d1 antes de d2? " + d1.before( d2 )); /
*
true
*
/
System.out.println("d1 depois de d2? " + d1.after( d2 )); /
*
false
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 466 / 549
Materiais Complementares Classe Date
Manipulao de Data
Para operaes de manipulao de data como somar
dias, alterar ms, subtrair uma data de outra, obter a
diferena entre duas datas, deve-se utilizar subclasses de
java.util.Calendar
Esse um tpico para vocs pesquisarem, caso desejem
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 467 / 549
Materiais Complementares
Classe StringBuilder e StringBuffer
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 468 / 549
Materiais Complementares Classe StringBuilder e
StringBuffer
Problema
Sabemos que quando voc altera um string, na verdade,
um novo string criado e o coletor de lixo (Garbage
Collector ou GC) ca responsvel por liberar a rea de
mmria anterior
Isto pode no ser um problema ao trabalhar com strings
pequenas. Contudo, imagine:
alterao de um caractere em um string armazenando todo
o contedo do livro do Deitel
insero caractere a caractere em um string
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 469 / 549
Materiais Complementares Classe StringBuilder e
StringBuffer
Programa Assassino
String tabelaAscii = "";
for ( char c = 0; c <= 255; c++ ) {
tabelaAscii += c;
}
System.out.println( tabelaAscii );
Pergunta
O que ocorre por trs desse programa?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 470 / 549
Materiais Complementares Classe StringBuilder e
StringBuffer
Soluo
No exemplo anterior para criar um string contendo os 255
caracteres da tabela ASCII, antes foram criados e
descartados 255 strings
Logo, para manipulao de strings no recomendvel
utilizar String, mas sim, StringBuilder ou StringBuffer
Essas classes foram criadas exclusivamente para a
manipulao de strings e tm a vantagem de no criar
strings a cada alterao
Isto , fazem um bom uso da memria
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 471 / 549
Materiais Complementares Classe StringBuilder e
StringBuffer
StringBuilder ou StringBuffer
StringBuilder ou StringBuffer funcionam exatamente
da mesma forma
A nica diferena que StringBuffer thread-safe, isto
, no deixa que dois threads acessem simultaneamente
Sucintamente, como se todos os mtodos de
StringBuffer fosse synchronized
Assim, os slides a seguir abordam exclusivamente
StringBuilder, mas funcionam de forma idntica com
StringBuffer
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 472 / 549
Materiais Complementares Classe StringBuilder e
StringBuffer
Construtores
Tanto StringBuilder quanto StringBuffer podem ser
criados:
vazio:
StringBuilder strBuffer = new StringBuilder();
a partir de um string:
StringBuilder strBuffer = new StringBuilder("inicial");
com um tamanho inicial j especicado (mas aumenta
automaticamente, caso necessrio)
StringBuilder strBuffer = new StringBuilder(256);
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 473 / 549
Materiais Complementares Classe StringBuilder e
StringBuffer
Eis a soluo para o Programa Assassino
StringBuilder tabelaAscii = new StringBuilder( 256 );
for ( char c = 0; c <= 255; c++ ) {
tabelaAscii.append( c );
}
System.out.println( tabelaAscii.toString() );
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 474 / 549
Materiais Complementares Classe StringBuilder e
StringBuffer
Alguns mtodos relevantes
/
*
Anexa qualquer coisa ao final
*
/
2 public StringBuilder append ( ? );
4 /
*
Insere qualquer coisa a partir de uma posicao
*
/
public StringBuilder insert ( int offset, ? );
6
/
*
Recupera o caractere em uma determinada posicao
*
/
8 public char charAt ( int index );
10 /
*
Deleta em um intervalo
*
/
public StringBuilder delete ( int start, int end );
12
/
*
Recupera o primeiro ndice que um string comea
*
/
14 public int indexOf ( String str );
16 /
*
Recupera o ltimo ndice que um string comea
*
/
public int lastIndexOf ( String str );
18
/
*
Inverte o contedo
*
/
20 public StringBuilder reverse ();
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 475 / 549
Materiais Complementares Classe StringBuilder e
StringBuffer
Exemplo Completo
StringBuilder strBuilder = new StringBuilder();
strBuilder.append( "Prof. Ricardo Tra" ); /
*
Prof. Ricardo Tra
*
/
strBuilder.insert( 15, "er" ); /
*
Prof. Ricardo Terra
*
/
strBuilder.delete( 0, 6 ); /
*
Ricardo Terra
*
/
System.out.println( strBuilder.indexOf( "Terra" ) ); /
*
8
*
/
System.out.println( strBuilder.lastIndexOf( "r" ) ); /
*
11
*
/
strBuilder.reverse();
System.out.println( strBuilder ); /
*
arreT odraciR
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 476 / 549
Materiais Complementares
Classe StringTokenizer
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 477 / 549
Materiais Complementares Classe StringTokenizer
Problema
Como j visto, o mtodo split divide um string pela
apario de um caractere ou de um string gerando um
arranjo de strings
Contudo, imagine um string que ser fragmentado em um
milho de partes
criar de uma s vez um arranjo de um milho de strings
requer grande espao de memria
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 478 / 549
Materiais Complementares Classe StringTokenizer
Soluo
Pensando nisso, Java prov um classe chamada
StringTokenizer que retorna um token (parte do string
original) por vez
o que praticamente elimina a demanda de memria
Alguns mtodos relevantes
1 /
*
Verifica se ainda possui mais tokens
*
/
public boolean hasMoreTokens ( );
3
/
*
Retorna o prximo token
*
/
5 public String nextToken ( );
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 479 / 549
Materiais Complementares Classe StringTokenizer
Exemplo
1 String str = "Carlos,Joao,Maria,Pedro";
3 StringTokenizer strTokenizer = new StringTokenizer( str, "," );
5 while ( strTokenizer.hasMoreTokens() ) {
System.out.println( strTokenizer.nextToken() );
7 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 480 / 549
Materiais Complementares
Classe Iterator
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 481 / 549
Materiais Complementares Classe Iterator
Iterator
Iterator um objeto que permite ao programador passar
por todos os elementos de uma coleo,
independentemente da sua implementao
tambm conhecido como cursor no contexto de banco de
dados
Mtodos
/
*
Verifica se ainda possui mais objetos
*
/
2 public boolean hasMore ( );
4 /
*
Retorna o prximo objeto
*
/
public <T> next ( );
6
/
*
Remove o ltimo objeto recuperado
*
/
8 public void remove ( );
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 482 / 549
Materiais Complementares Classe Iterator
O que pode ser iterado?
Classes que implementam a interface Iterable
possuem um nico mtodo: Iterator<T> iterator ( )
Em Java, todas as colees implementam tal interface
Exemplo
Collection<String> nomes = new ArrayList<String>();
2 nomes.add( "Carla" );
nomes.add( "Pedro" );
4 nomes.add( "Ricardo" );
6 for ( Iterator<String> it = nomes.iterator(); it.hasNext(); ) {
String nome = it.next();
8 System.out.println( nome );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 483 / 549
Materiais Complementares Classe Iterator
Mas, com foreach no bem mais fcil?
Collection<String> nomes = new ArrayList<String>();
2 nomes.add( "Carla" );
nomes.add( "Pedro" );
4 nomes.add( "Ricardo" );
6 for ( String nome : nomes ) {
System.out.println( nome );
8 }
Sim, mas, na verdade, o foreach s funciona em classes
que implementam Iterable
possuem um nico mtodo: Iterator<T> iterator ( )
Em Java, todas as colees implementam tal interface
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 484 / 549
Materiais Complementares Classe Iterator
No entanto...
Collection<String> nomes = new ArrayList<String>();
2 nomes.add( "Carla" );
nomes.add( "Pedro" );
4 nomes.add( "Ricardo" );
6 for ( String nome : nomes ) {
if (nome.startsWith("R")){
8 nomes.remove(nome); /
*
Erro
*
/
}
10 }
Voc no pode remover um elemento (linha 8) da mesma
lista que voc est iterando (linha 6)
java.util.ConcurrentModificationException
Soluo nesse caso: usar Iterator
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 485 / 549
Materiais Complementares Classe Iterator
Removendo elementos da forma correta durante a iterao
de uma lista
Collection<String> nomes = new ArrayList<String>();
2 nomes.add( "Carla" );
nomes.add( "Pedro" );
4 nomes.add( "Ricardo" );
6 Iterator<String> it = nomes.iterator();
while ( it.hasNext() ) {
8 String nome = it.next();
if (nome.startsWith("R")){
10 it.remove(); /
*
Remove o ultimo elemento lido da lista
*
/
}
12 }
14 for (String nome : nomes){
System.out.println(nome);
16 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 486 / 549
Materiais Complementares
Colees
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 487 / 549
Materiais Complementares Colees
Problema
Alocao esttica: espao pr-determinado a tempo de
compilao. Ex:
int v[] = new int[100];
Alocao dinmica: espao determinado a tempo de
compilao. Ex:
int n = Teclado.lerInteger("Tamanho:");
int v[] = new int[n];
Mas, e quando no temos ideia do tamanho?
Estruturas de dados com tamanho varivel
Tais como listas, conjuntos, las, pilhas ...
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 488 / 549
Materiais Complementares Colees
Observe o que a API de Java prov para ns
Foco
Neste material, abordaremos somente classe ArrayList
No entanto, observe que se trabalharmos com a interface
Collection, a implementao no importa
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 489 / 549
Materiais Complementares Colees
Explicao sucinta dos sub-tipos de Collection
List: listas encadeadas (pode haver repetio)
Set: conjunto (no h repetio)
Queue: implementao de la (FIFO)
Stack: implementao de pilha (FILO)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 490 / 549
Materiais Complementares Colees
Alguns mtodos relevantes de Collection
1 /
*
Adiciona um objeto na coleo
*
/
boolean add(E o);
3
/
*
Remove um objeto da coleo
*
/
5 boolean remove(Object o)
7 /
*
Adiciona toda uma coleo coleo
*
/
boolean addAll(Collection c)
9
/
*
Remove todos os elementos da coleo
*
/
11 void clear()
13 /
*
Verifica se tal objeto existe na coleo
*
/
boolean contains(Object o)
15
/
*
Retorna o tamanho da coleo
*
/
17 int size()
19 /
*
Verifica se a coleo est vazia
*
/
boolean isEmpty()
21
/
*
Retorna os objetos da coleo como um arranjo
*
/
23 Object[] toArray()
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 491 / 549
Materiais Complementares Colees
Alguns mtodos relevantes de List
1 /
*
Retorna um objeto em um dado ndice
*
/
E get(int i);
Pergunta
Por que o mtodo get no est na interface Collection?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 492 / 549
Materiais Complementares Colees
Utilizando...
Collection<String> nomes = new ArrayList<String>();
nomes.add( "Ricardo" );
nomes.clear();
System.out.printf( "Vazia? %b\n", nomes.isEmpty() ); /
*
true
*
/
nomes.add( "Ricardo" );
nomes.add( "Virgilio" );
nomes.add( "Cesar" );
System.out.println( nomes.size() ); /
*
3
*
/
System.out.println( nomes.contains( "Ricardo" ) ); /
*
true
*
/
for ( String nome : nomes ) {
System.out.println(nome);
}
ArrayList pode ser trocado por qualquer subclasse de
Collection sem impacto algum aplicao
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 493 / 549
Materiais Complementares Colees
Observao Importante
Observe que o exemplo anterior aplica Programao por
Contrato
Voc pode mudar a implementao da coleo sem
impacto algum aplicao
Mas, se voc precisasse utilizar algum mtodo especco,
como o mtodo get que s existe na interface List
Nos slides a seguir, so mostradas duas possveis solues
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 494 / 549
Materiais Complementares Colees
Soluo 1: diminuir o grau de abstrao
List<String> nomes = new ArrayList<String>();
nomes.add( "Ricardo" );
nomes.clear();
System.out.printf( "Vazia? %b\n", nomes.isEmpty() ); /
*
true
*
/
nomes.add( "Ricardo" );
nomes.add( "Virgilio" );
nomes.add( "Cesar" );
System.out.println( nomes.size() ); /
*
3
*
/
System.out.println( nomes.contains( "Ricardo" ) ); /
*
true
*
/
for ( int i = 0; i < nomes.size(); i++ ) {
System.out.println( nomes.get( i ) );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 495 / 549
Materiais Complementares Colees
Soluo 2: Fazer cast
Collection<String> nomes = new ArrayList<String>();
nomes.add( "Ricardo" );
nomes.clear();
System.out.printf( "Vazia? %b\n", nomes.isEmpty() ); /
*
true
*
/
nomes.add( "Ricardo" );
nomes.add( "Virgilio" );
nomes.add( "Cesar" );
System.out.println( nomes.size() ); /
*
3
*
/
System.out.println( nomes.contains( "Ricardo" ) ); /
*
true
*
/
if ( nomes instanceof List ) {
List<String> listaNomes = (List<String>) nomes;
for ( int i = 0; i < nomes.size(); i++ ) {
System.out.println( listaNomes.get( i ) );
}
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 496 / 549
Materiais Complementares Colees
Ordenando...
importante que voc possa ordenar uma lista (no uma
coleo)
Para isso, basta:
os objetos da lista devem ser comparveis
invocar o mtodo que ordena a lista:
Collections.sort (List l)
Um objeto comparvel se, e somente se, implementa a
interface Comparable
Tal interface requer a implementao de um nico mtodo:
int compareTo (E o)
Nos slides a seguir, apresentado um exemplo completo
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 497 / 549
Materiais Complementares Colees
Classe Pessoa
public class Pessoa implements Comparable<Pessoa> {
private final String nome;
private int idade;
public Pessoa(String nome, int idade) {
super();
this.nome = nome;
this.idade = idade;
}
public int getIdade() {
return this.idade;
}
public void setIdade( int idade ) {
this.idade = idade;
}
public String getNome() {
return this.nome;
}
@Override
public String toString() {
return this.nome + " tem " + this.idade + " anos";
}
/
*
continua
*
/
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 498 / 549
Materiais Complementares Colees
Classe Pessoa
@Override
public boolean equals( Object o ) {
if ( o != null && o instanceof Pessoa ) {
Pessoa p = (Pessoa) o;
return p.nome.equals( this.nome ) && p.idade == this.idade;
}
return false;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime
*
result + idade;
result = prime
*
result + ((nome == null) ? 0 : nome.hashCode());
return result;
}
@Override
public int compareTo( Pessoa p ) {
if ( this.idade > p.idade ) {
return 1;
} else if ( this.idade < p.idade ) {
return -1;
}
return 0;
}
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 499 / 549
Materiais Complementares Colees
Exemplo Completo
List<Pessoa> pessoas = new ArrayList<Pessoa>();
pessoas.add( new Pessoa( "Ricardo", 21 ) );
pessoas.add( new Pessoa( "Cesar", 38 ) );
pessoas.add( new Pessoa( "Virgilio", 31 ) );
Collections.sort( pessoas );
for ( Pessoa p : pessoas ) {
System.out.println( p );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 500 / 549
Materiais Complementares Colees
Dica
O mtodo compareTo pode ser bem simples
Normalmente !
Suponha que as pessoas fossem ordenadas pelo nome
Basta retornar o retorno do mtodo compareTo da classe
String
Isso porque a classe String j implementa Comparable!
Observe
@Override
public int compareTo( Pessoa p ) {
return this.nome.compareTo( p.nome );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 501 / 549
Materiais Complementares Colees
Observao Importante!
Para uso correto de colees, as classes dos objetos
contidos nela devem:
ou no sobrescreverem os mtodos equals nem hashCode
ou sobrescreverem os mtodos equals e hashCode
regra: dois objetos iguais devem ter o mesmo cdigo hash
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 502 / 549
Materiais Complementares
Usando import static
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 503 / 549
Materiais Complementares Usando import static
Instruo import static
Em Java, quando-se usa muito membros (atributos e
mtodos) estticos de uma classe, talvez seja interessante
utilizamos o recurso import static
Basicamente, esse recurso evita que voc tenha que
escrever o nome da classe sempre antes de acessar um
atributo ou invocar um mtodo esttico
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 504 / 549
Materiais Complementares Usando import static
Exemplo motivator
1 package calculo;
3 public class Exemplo01 {
5 public static void main(String[] args) {
System.out.printf("%d^(1/2) = %.2f\n", 225, Math.sqrt(225));
7
System.out.printf("%d^5 = %.2f\n", 7, Math.pow(7, 5));
9
System.out.printf("seno(%f) = %.2f\n", Math.PI / 2,
11 Math.sin(Math.PI / 2));
}
13
}
Pergunta-se
Algo incomoda?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 505 / 549
Materiais Complementares Usando import static
Melhorou?
package calculo;
2
import static java.lang.Math.sqrt;
4 import static java.lang.Math.pow;
import static java.lang.Math.sin;
6 import static java.lang.Math.PI;
8 public class Exemplo02 {
public static void main(String[] args) {
10 System.out.printf("%d^(1/2) = %.2f\n", 225, sqrt(225));
12 System.out.printf("%d^5 = %.2f\n", 7, pow(7, 5));
14 System.out.printf("seno(%f) = %.2f\n", PI / 2, sin(PI / 2));
}
16 }
Pergunta-se
E se voc for utilizar vrios atributos/mtodos da mesma classe?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 506 / 549
Materiais Complementares Usando import static
100% agora?
package calculo;
2
import static java.lang.Math.
*
;
4
public class Exemplo03 {
6
public static void main(String[] args) {
8 System.out.printf("%d^(1/2) = %.2f\n", 225, sqrt(225));
10 System.out.printf("%d^5 = %.2f\n", 7, pow(7, 5));
12 System.out.printf("seno(%f) = %.2f\n", PI / 2, sin(PI / 2));
}
14
}
Pergunta-se
Devo usar sempre?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 507 / 549
Materiais Complementares Usando import static
O que voc acha disso?
1 package calculo;
3 import static java.lang.Math.
*
;
import static java.lang.System.out;
5
public class Exemplo04 {
7
public static void main(String[] args) {
9 out.printf("%d^(1/2) = %.2f\n", 225, sqrt(225));
11 out.printf("%d^5 = %.2f\n", 7, pow(7, 5));
13 out.printf("seno(%f) = %.2f\n", PI / 2, sin(PI / 2));
}
15
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 508 / 549
Materiais Complementares Usando import static
Consideraes Finais
O import static um syntactic sugar bem interessante
Us-lo com a classe Math em uma classe que vai utilizar
vrios de seus mtodos considerado um BOM uso
No entanto, eu no recomendo seu uso sempre, mas sim,
em situaes que imploram pelo seu uso
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 509 / 549
8. Extras Contedo
1
Introduo 3
2
UML 22
3
Java 62
4
POO 186
5
Padres de Projeto 359
6
Tpicos Relevantes 389
7
Materiais Complementares 420
8
Extras 510
Importando Projeto Existente no Eclipse 511
Adicionando Biblioteca em Projeto 521
Biblioteca TerraUtil 531
Testando com jUnit 539
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 510 / 549
Extras
Importando Projeto Existente no Eclipse
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 511 / 549
Extras Importando Projeto Existente no Eclipse
Em algumas situaes um projeto foi iniciado em uma
mquina e ser continuado em uma outra
Muitos alunos tm srios problemas em fazer isso
Os slides a seguir demonstram como importar um projeto j
existente no Eclipse
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 512 / 549
Extras Importando Projeto Existente no Eclipse
Em que diretrio est armazenado o meu projeto?
Inicialmente, voc deve armazenar toda a pasta em que o
projeto est contido
Para descobrir em que pasta est seu projeto, basta clicar
com o boto direito sobre o projeto e clicar em Properties
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 513 / 549
Extras Importando Projeto Existente no Eclipse
Por exemplo, o projeto Teste est na pasta /Developer/workspace/Teste
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 514 / 549
Extras Importando Projeto Existente no Eclipse
Vamos supor que copiou o projeto Teste para uma outra
mquina e que ele agora esteja no diretrio /Doc/Teste
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 515 / 549
Extras Importando Projeto Existente no Eclipse
V em File Import
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 516 / 549
Extras Importando Projeto Existente no Eclipse
Selecione General Existing Projects Into Workspace e clique em Next
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 517 / 549
Extras Importando Projeto Existente no Eclipse
No campo Select root directory coloque o diretrio em que o projeto est contido
No exemplo ser: /Doc, veja que ele aparece no campo Projects e clique em Finish
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 518 / 549
Extras Importando Projeto Existente no Eclipse
Observe que agora o projeto aparece em sua lista de projetos
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 519 / 549
Extras Importando Projeto Existente no Eclipse
Pronto!
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 520 / 549
Extras
Adicionando Biblioteca em Projeto
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 521 / 549
Extras Adicionando Biblioteca em Projeto
Em algumas situaes faz-se necessria a utilizao de
classes j existentes que so disponibilizadas em uma
biblioteca
Essas bibliotecas so geralmente um arquivo JAR que deve
ser importado no seu projeto do Eclipse
Os slides a seguir demonstram como importar uma
biblioteca externa no Eclipse de dois modos:
A biblioteca foi copiada para o diretrio do projeto
A biblioteca no foi copiada para o diretrio do projeto
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 522 / 549
Extras Adicionando Biblioteca em Projeto
A biblioteca foi copiada para o diretrio do projeto
(altamente recomendado, pois facilita a importao do projeto em outras mquinas)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 523 / 549
Extras Adicionando Biblioteca em Projeto
Clique com o boto direito na biblioteca, v em Build Path e depois em Add to
Build Path
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 524 / 549
Extras Adicionando Biblioteca em Projeto
Observe que a biblioteca aparecer em Referenced Libraries
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 525 / 549
Extras Adicionando Biblioteca em Projeto
A biblioteca no foi copiada para o diretrio do projeto
(no recomendado, pois gera erro na importao do projeto em outras mquinas)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 526 / 549
Extras Adicionando Biblioteca em Projeto
Clique com o boto direito no projeto, v em Build Path e depois em Add External
Archives...
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 527 / 549
Extras Adicionando Biblioteca em Projeto
Selecione a biblioteca (extenso JAR) desejada onde ela estiver
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 528 / 549
Extras Adicionando Biblioteca em Projeto
Observe que a biblioteca aparecer em Referenced Libraries
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 529 / 549
Extras Adicionando Biblioteca em Projeto
Pronto!
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 530 / 549
Extras
Biblioteca TerraUtil
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 531 / 549
Extras Biblioteca TerraUtil
TerraUtil uma biblioteca criada com o intuito de:
facilitar a leitura de tipos primitivos (char, int, double etc) e
de strings a partir do teclado
facilitar a converso de string para data e vice-versa
um arquivo JAR com apenas duas classes:
com.terra.util.Teclado
com.terra.util.Conversor
Para ser utilizada deve ser adicionada como biblioteca do
projeto (veja p. 2)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 532 / 549
Extras Biblioteca TerraUtil
Mtodos da classe Teclado
public static char lerChar(String rotulo)
2
public static byte lerByte(String rotulo)
4
public static short lerShort(String rotulo)
6
public static int lerInteger(String rotulo)
8
public static long lerLong(String rotulo)
10
public static float lerFloat(String rotulo)
12
public static double lerDouble(String rotulo)
14
public static String lerString(String rotulo)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 533 / 549
Extras Biblioteca TerraUtil
Implementao da classe Teclado
S para se ter uma ideia de como a implementao dos
mtodos da classe Teclado, segue o cdigo fonte do
mtodo lerString que o mais simples
1 public class Teclado {
...
3 public static String lerString(String rotulo) {
System.out.print(rotulo + ": ");
5 Scanner s = new Scanner(System.in);
return s.nextLine();
7 }
...
9 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 534 / 549
Extras Biblioteca TerraUtil
Exemplo de Uso
1 public static void main( String[] args ) {
char ch = Teclado.lerChar( "Digite uma letra" );
3 int i = Teclado.lerInteger( "Digite uma idade" );
double d = Teclado.lerDouble( "Digite um preco" );
5 String s = Teclado.lerString( "Digite um nome" );
7 System.out.printf( "Digitados: %c %d %.2f %s", ch, i, d, s );
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 535 / 549
Extras Biblioteca TerraUtil
Mtodos da classe Conversor
/
*
Converte um objeto Date em um string no formato desejado
*
/
2 public static String dateToString(Date data, String pattern)
4 /
*
Converte um string em um formato especifico em um tipo Date
*
/
public static Date stringToDate(String strDate, String pattern)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 536 / 549
Extras Biblioteca TerraUtil
Exemplo de Uso
1 public static void main( String[] args ) {
Date d = new Date();
3 /
*
Imprime a data atual no formato informado
*
/
System.out.println( "Data Atual: "
5 + Conversor.dateToString( d, "dd/MM/yyyy HH:mm:ss" ) );
7 /
*
*
Converte o string "05/07/2019" para data e depois imprime a data
9
*
criada no formato informado
*
/
11 d = Conversor.stringToDate( "05/07/2019", "dd/MM/yyyy" );
if ( d != null ) {
13 System.out.println( Conversor.dateToString( d,
"dd de MMMM de yyyy" ) );
15 }
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 537 / 549
Extras Biblioteca TerraUtil
Implementao da classe Conversor
1 public class Conversor {
3 public static String dateToString(Date data, String pattern) {
if (pattern == null) {
5 pattern = "dd/MM/yyyy";
}
7 DateFormat dateFormat = new SimpleDateFormat(pattern);
return dateFormat.format(data);
9 }
11 public static Date stringToDate(String strDate, String pattern) {
if (pattern == null) {
13 pattern = "dd/MM/yyyy";
}
15 DateFormat dateFormat = new SimpleDateFormat(pattern);
dateFormat.setLenient(false);
17 try {
return dateFormat.parse(strDate);
19 } catch (ParseException e) {
return null;
21 }
23 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 538 / 549
Extras
Testando com jUnit
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 539 / 549
Extras Testando com jUnit
jUnit
jUnit um framework para realizao de testes de unidade
em aplicativos Java
automatiza a execuo dos testes
habilita testes de regresso
Embora o jUnit no seja parte integrante do JDK, ele vem
integrado maioria dos IDEs (Eclipse, BlueJ, etc.)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 540 / 549
Extras Testando com jUnit
Cenrio Motivador
1
Voc acabou de implementar um projeto OO
2
Voc no sabe se est funcionando como esperado
3
Voc logo pensa: Bora test-lo!
4
Assim, voc cria uma classe com mtodo main
5
Nesse mtodo:
voc pede para o usurio entrar com uma srie de valores
voc imprime os resultados (System.out.printlnsss...)
voc confere os resultados no olhmetro
6
Por m, sistema 100% convel (aham...)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 541 / 549
Extras Testando com jUnit
Classe Bhaskara
1 public class Bhaskara {
private final double a;
3 private final double b;
private final double c;
5
public Bhaskara(double a, double b, double c) {
7 this.a = a;
this.b = b;
9 this.c = c;
}
11
/
*
Metodos Acessores
*
/
13
public double delta() {
15 return Math.pow(this.b, 2) - 4
*
this.a
*
this.c;
}
17
public double[] raizes() {
19 double raizes[] = null;
double delta = this.delta();
21 if (delta == 0) {
raizes = new double[]{ -this.b / (2
*
this.a) };
23 } else if (delta > 0) {
raizes = new double[]{ (-this.b + Math.sqrt(delta)) / (2
*
this.a),
25 (-this.b - Math.sqrt(delta)) / (2
*
this.a) };
}
27 return raizes;
}
29 }
Pergunta-se
Algo incomoda?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 542 / 549
Extras Testando com jUnit
Isso teste?
public static void main(String[] args) {
2 double a = Teclado.lerDouble("Digite a");
double b = Teclado.lerDouble("Digite b");
4 double c = Teclado.lerDouble("Digite c");
6 Bhaskara equacao = new Bhaskara(a, b, c);
System.out.println("A: " + equacao.getA());
8 System.out.println("B: " + equacao.getB());
System.out.println("C: " + equacao.getC());
10 System.out.println("Delta: " + equacao.delta());
12 System.out.print("Raizes: ");
double[] raizes = equacao.raizes();
14 if (raizes == null) {
System.out.print("nenhuma");
16 } else {
for (double raiz : raizes) {
18 System.out.print(raiz + "\t");
}
20 }
}
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 543 / 549
Extras Testando com jUnit
Isso teste?
1 public static void main(String[] args) {
double a = Teclado.lerDouble("Digite a");
3 double b = Teclado.lerDouble("Digite b");
double c = Teclado.lerDouble("Digite c");
5
Bhaskara equacao = new Bhaskara(a, b, c);
7 System.out.println("A: " + equacao.getA());
System.out.println("B: " + equacao.getB());
9 System.out.println("C: " + equacao.getC());
System.out.println("Delta: " + equacao.delta());
11
System.out.print("Raizes: ");
13 double[] raizes = equacao.raizes();
if (raizes == null) {
15 System.out.print("nenhuma");
} else {
17 for (double raiz : raizes) {
System.out.print(raiz + "\t");
19 }
}
21 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 543 / 549
Sem dvida!
Extras Testando com jUnit
Prs
Melhor que nada!
Contras
O usurio deve manualmente entrar com os valores
Nada garante que um teste realizado ontem ainda est
funcionando hoje
Re-execuo custosa dos testes
Testes so especicados em planilhas (no melhor caso)
...
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 544 / 549
Extras Testando com jUnit
Um Cenrio mais Interessante
1
Voc acabou de implementar um projeto OO
2
Voc no sabe se est funcionando como esperado
3
Voc logo pensa: Bora test-lo!
4
Assim, voc cria classes de teste (TestCase)
que contm diversos mtodos de teste (@Test)
5
Em cada mtodo:
voc cria uma instncia da classe a ser testada
voc direciona o teste a um mtodo especco da classe
voc assegura (assert) algum resultado
6
Por m, sistema 100% convel (aham de novo...)
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 545 / 549
Extras Testando com jUnit
Alguns mtodos relevantes de Assert
1 /
*
Assegura o valor de um objeto ou de um tipo primitivo (exceto ponto flutuante)
*
/
void assertEquals(char expected, char actual);
3 void assertEquals(int expected, int actual);
void assertEquals(Object expected, Object actual);
5
/
*
Assegura o valor de um tipo flutuante
*
/
7 void assertEquals(double expected, double actual, double delta);
9 /
*
Assegura que falso
*
/
void assertFalse(double condition);
11
/
*
Assegura que verdade
*
/
13 void assertTrue(double condition);
15 /
*
Assegura que nulo
*
/
void assertNull(Object object);
17
/
*
Assegura que no nulo
*
/
19 void assertNotNull(Object object);
21 /
*
Assegura o valor de um arranjo de objetos ou de tipos primitivos
*
/
void assertArrayEquals(char[] expecteds, char[] actuals);
23 void assertArrayEquals(int[] expecteds, int[] actuals);
void assertArrayEquals(Object[] expecteds, Object[] actuals);
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 546 / 549
Extras Testando com jUnit
Alguns mtodos relevantes de Assert
/
*
Assegura o valor de um objeto ou de um tipo primitivo (exceto ponto flutuante)
*
/
2 void assertEquals(char expected, char actual);
void assertEquals(int expected, int actual);
4 void assertEquals(Object expected, Object actual);
6 /
*
Assegura o valor de um tipo flutuante
*
/
void assertEquals(double expected, double actual, double delta);
8
/
*
Assegura que falso
*
/
10 void assertFalse(double condition);
12 /
*
Assegura que verdade
*
/
void assertTrue(double condition);
14
/
*
Assegura que nulo
*
/
16 void assertNull(Object object);
18 /
*
Assegura que no nulo
*
/
void assertNotNull(Object object);
20
/
*
Assegura o valor de um arranjo de objetos ou de tipos primitivos
*
/
22 void assertArrayEquals(char[] expecteds, char[] actuals);
void assertArrayEquals(int[] expecteds, int[] actuals);
24 void assertArrayEquals(Object[] expecteds, Object[] actuals);
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 546 / 549
Exemplo 1:
assertEquals(A, Character.toTitleCase(a));
assertEquals(5, Util.vogais().length);
Extras Testando com jUnit
Alguns mtodos relevantes de Assert
/
*
Assegura o valor de um objeto ou de um tipo primitivo (exceto ponto flutuante)
*
/
2 void assertEquals(char expected, char actual);
void assertEquals(int expected, int actual);
4 void assertEquals(Object expected, Object actual);
6 /
*
Assegura o valor de um tipo flutuante
*
/
void assertEquals(double expected, double actual, double delta);
8
/
*
Assegura que falso
*
/
10 void assertFalse(double condition);
12 /
*
Assegura que verdade
*
/
void assertTrue(double condition);
14
/
*
Assegura que nulo
*
/
16 void assertNull(Object object);
18 /
*
Assegura que no nulo
*
/
void assertNotNull(Object object);
20
/
*
Assegura o valor de um arranjo de objetos ou de tipos primitivos
*
/
22 void assertArrayEquals(char[] expecteds, char[] actuals);
void assertArrayEquals(int[] expecteds, int[] actuals);
24 void assertArrayEquals(Object[] expecteds, Object[] actuals);
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 546 / 549
Exemplo 2:
//assertEquals(3.1415, Math.PI, 0); --> Falha
assertEquals(3.1415, Math.PI, 0.0001);
Extras Testando com jUnit
Alguns mtodos relevantes de Assert
/
*
Assegura o valor de um objeto ou de um tipo primitivo (exceto ponto flutuante)
*
/
2 void assertEquals(char expected, char actual);
void assertEquals(int expected, int actual);
4 void assertEquals(Object expected, Object actual);
6 /
*
Assegura o valor de um tipo flutuante
*
/
void assertEquals(double expected, double actual, double delta);
8
/
*
Assegura que falso
*
/
10 void assertFalse(double condition);
12 /
*
Assegura que verdade
*
/
void assertTrue(double condition);
14
/
*
Assegura que nulo
*
/
16 void assertNull(Object object);
18 /
*
Assegura que no nulo
*
/
void assertNotNull(Object object);
20
/
*
Assegura o valor de um arranjo de objetos ou de tipos primitivos
*
/
22 void assertArrayEquals(char[] expecteds, char[] actuals);
void assertArrayEquals(int[] expecteds, int[] actuals);
24 void assertArrayEquals(Object[] expecteds, Object[] actuals);
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 546 / 549
Exemplo 3:
String s = "canavial";
assertFalse(s.contains("bial"));
assertTrue(s.contains("cana"));
Extras Testando com jUnit
Alguns mtodos relevantes de Assert
/
*
Assegura o valor de um objeto ou de um tipo primitivo (exceto ponto flutuante)
*
/
2 void assertEquals(char expected, char actual);
void assertEquals(int expected, int actual);
4 void assertEquals(Object expected, Object actual);
6 /
*
Assegura o valor de um tipo flutuante
*
/
void assertEquals(double expected, double actual, double delta);
8
/
*
Assegura que falso
*
/
10 void assertFalse(double condition);
12 /
*
Assegura que verdade
*
/
void assertTrue(double condition);
14
/
*
Assegura que nulo
*
/
16 void assertNull(Object object);
18 /
*
Assegura que no nulo
*
/
void assertNotNull(Object object);
20
/
*
Assegura o valor de um arranjo de objetos ou de tipos primitivos
*
/
22 void assertArrayEquals(char[] expecteds, char[] actuals);
void assertArrayEquals(int[] expecteds, int[] actuals);
24 void assertArrayEquals(Object[] expecteds, Object[] actuals);
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 546 / 549
Exemplo 4:
Pessoa p = new Pessoa("Carol", null);
assertNotNull(p);
assertNotNull(p.getNome());
assertNull(p.getDataNascimento());
Extras Testando com jUnit
Alguns mtodos relevantes de Assert
/
*
Assegura o valor de um objeto ou de um tipo primitivo (exceto ponto flutuante)
*
/
2 void assertEquals(char expected, char actual);
void assertEquals(int expected, int actual);
4 void assertEquals(Object expected, Object actual);
6 /
*
Assegura o valor de um tipo flutuante
*
/
void assertEquals(double expected, double actual, double delta);
8
/
*
Assegura que falso
*
/
10 void assertFalse(double condition);
12 /
*
Assegura que verdade
*
/
void assertTrue(double condition);
14
/
*
Assegura que nulo
*
/
16 void assertNull(Object object);
18 /
*
Assegura que no nulo
*
/
void assertNotNull(Object object);
20
/
*
Assegura o valor de um arranjo de objetos ou de tipos primitivos
*
/
22 void assertArrayEquals(char[] expecteds, char[] actuals);
void assertArrayEquals(int[] expecteds, int[] actuals);
24 void assertArrayEquals(Object[] expecteds, Object[] actuals);
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 546 / 549
Exemplo 5:
assertArrayEquals(new char[]{A,E,I,O,U},
Util.vogais());
Extras Testando com jUnit
Melhorou?
import static org.junit.Assert.
*
;
2 import org.junit.Test;
4 public class TesteBhaskara {
6 @Test
public void testConstrutor() {
8 Bhaskara equacao = new Bhaskara(3, 6, 9);
assertEquals(3, equacao.getA(), 0);
10 assertEquals(6, equacao.getB(), 0);
assertEquals(9, equacao.getC(), 0);
12 }
14 @Test
public void testDelta() {
16 Bhaskara equacao = new Bhaskara(1, 3.2, 2.5);
assertEquals(0.24, equacao.delta(), 0.001); /
*
0.24000000001
*
/
18 }
20 @Test
public void testRaizes() {
22 Bhaskara equacao = new Bhaskara(1, -5, 6);
assertEquals(1, equacao.delta(), 0);
24 double raizes[] = equacao.raizes();
assertEquals(2, raizes.length);
26 assertEquals(3.0, raizes[0], 0);
assertEquals(2.0, raizes[1], 0);
28 }
30 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 547 / 549
Extras Testando com jUnit
Melhorou?
import static org.junit.Assert.
*
;
2 import org.junit.Test;
4 public class TesteBhaskara {
6 @Test
public void testConstrutor() {
8 Bhaskara equacao = new Bhaskara(3, 6, 9);
assertEquals(3, equacao.getA(), 0);
10 assertEquals(6, equacao.getB(), 0);
assertEquals(9, equacao.getC(), 0);
12 }
14 @Test
public void testDelta() {
16 Bhaskara equacao = new Bhaskara(1, 3.2, 2.5);
assertEquals(0.24, equacao.delta(), 0.001); /
*
0.24000000001
*
/
18 }
20 @Test
public void testRaizes() {
22 Bhaskara equacao = new Bhaskara(1, -5, 6);
assertEquals(1, equacao.delta(), 0);
24 double raizes[] = equacao.raizes();
assertEquals(2, raizes.length);
26 assertEquals(3.0, raizes[0], 0);
assertEquals(2.0, raizes[1], 0);
28 }
30 }
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 547 / 549
Sem dvida!
Extras Testando com jUnit
Prs
Estado-da-prtica!
Automatizado!
Re-execuo fcil dos testes!
Especicao auto-contida dos testes!
...
Contras
Hein?
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 548 / 549
Referncias
Harvey M. Deitel and Paul J. Deitel.
Java: Como Programar.
Pearson, 8 edition, 2010.
Martin Fowler.
UML Essencial.
Bookman, 3 edition, 2004.
Cay S. Horstmann and Gary Cornell.
Core Java: Volume 1 - Fundamentos.
Pearson, 8 edition, 2010.
Ricardo Terra (rterrabh@gmail.com) POO 15 de janeiro de 2014 549 / 549

Вам также может понравиться